shiro框架总结二

来源:互联网 发布:nba骑士vs公牛数据 编辑:程序博客网 时间:2024/05/21 10:01

1.sessionid,以及cookie配置

<!-- 会话Cookie模板 --><bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie">

<!-- 会话Cookie模板 --><bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie">    <constructor-arg value="v_v-s-baidu"/><!-- 这是一个坑来着,不能乱设置值,不然浏览器会设置为deleteme,下次浏览的时候cookie会不见了-->    <property name="httpOnly" value="true"/>    <!--cookie的有效时间 -->    <property name="maxAge" value="-1"/></bean>


<!-- 会话Session ID生成器 --><bean id="sessionIdGenerator" class="org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator"/>
<!-- 会话验证调度器 --><bean id="sessionValidationScheduler" class="org.apache.shiro.session.mgt.ExecutorServiceSessionValidationScheduler"> <!-- 间隔多少时间检查,不配置是60分钟 -->     <property name="interval" value="18000000"/>     <property name="sessionManager" ref="sessionManager"/></bean>


<!-- Session Manager --><bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager"><!-- 相隔多久检查一次session的有效性   --> <property name="sessionValidationInterval" value="1800000"/>    <!-- session 有效时间为半小时 (毫秒单位)-->  <property name="globalSessionTimeout" value="1800000"/>   <property name="sessionDAO" ref="sessionDAO"/>   <!-- 间隔多少时间检查,不配置是60分钟 -->  <property name="sessionValidationScheduler" ref="sessionValidationScheduler"/>  <!-- 是否开启 检测,默认开启 -->  <property name="sessionValidationSchedulerEnabled" value="true"/>   <!-- 是否删除无效的,默认也是开启 -->  <property name="deleteInvalidSessions" value="true"/><!-- 会话Cookie模板 -->   <property name="sessionIdCookie" ref="sessionIdCookie"/></bean>
<!-- 配置Session DAO的操作处理 --> <bean id="sessionDAO" class="org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO">     <!-- 设置session缓存的名字,这个名字可以任意 -->     <property name="activeSessionsCacheName" value="shiro-activeSessionCache"/>     <!-- 定义该Session DAO操作中所使用的ID生成器 -->     <property name="sessionIdGenerator" ref="sessionIdGenerator"/> </bean>



shiro是通过session进行管理用户的,通过用户回传的cookie进行判断

2.各种拦截器(包括登录拦截器,角色拦截器,权限拦截器)

都继承AccessControlFilter这个类, 重写父类的isAccessAllowed()方法------》验证登录,权限等等

                                                                           onAccessDenied()方法------》访问失败的跳转等等

3.配置授权认证

重头戏!!!为啥这么讲呢?登录验证,权限验证具体操作都在里面实现

<!-- 授权 认证 --><bean id="sampleRealm" class="shiro.token.SampleRealm" ></bean>

授权

SimpleAuthorizationInfo info =  new SimpleAuthorizationInfo();
info.setRoles(roles);
info.setStringPermissions(permissions);
登录验证(包含一个用户只能登录一次,不能重复登录)

/** *  认证信息,主要针对用户登录,  */@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken arg0) throws AuthenticationException {ShiroToken token = (ShiroToken) arg0;UUser user;boolean b=false;//判断是否已经登录,也可以封装成一个实体类/* * 下面应该写成一个方法的,然后再创建一个实体类来保存session里面所有值,比如 * object.getString("nickname") */ Collection<Session> sessions = sessionDAO.getActiveSessions();          for(Session session:sessions){               String s=String.valueOf(session.getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY));//获得session中已经登录用户的名字                JSONObject object=JSONObject.fromObject(s);             if(null!=object){             try{             if(null!=object.getString("nickname")){             String loginUsername=object.getString("nickname");              if(token.getUsername().equals(loginUsername)){                                  System.out.println(loginUsername+"已经登录,不能再次登录");                   b=true;              }              }             }catch (Exception e) {e.printStackTrace();}                           }                         }if(b==false&&token.getUsername().equals("ys")&&token.getPswd().equals("123456")){user =new UUser(token.getUsername(),token.getPswd()); }else{user=null;}if(null == user){throw new AccountException("帐号或密码不正确!");}else{//更新登录时间 last login timeuser.setLastLoginTime(new Date());}return new SimpleAuthenticationInfo(user,user.getPswd(), getName());}

4.定义各种跳转链接,以及配置链接的权限

<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"><property name="securityManager" ref="securityManager" /><property name="loginUrl" value="/u/index" /><!-- 页面错误处理 --><property name="successUrl" value="/" />
<!-- 没有权限时候的跳转 -->
<property name="unauthorizedUrl" value="/?login" /><!--初始配置,现采用自定义--><property name="filterChainDefinitions" ><value>/u/login = anon/u/index=anon/WEB-INF/jsp/*=anon/u/hi=login,permission           </value></property>       <property name="filters">           <util:map>              <entry key="login" value-ref="login"></entry>              <entry key="role" value-ref="role"></entry>                         <entry key="permission" value-ref="permission"></entry>              <entry key="authc">     <bean      class="org.apache.shiro.web.filter.authc.PassThruAuthenticationFilter" />    </entry>           </util:map>       </property></bean>