Shiro 与 Spring框架整合

本文详细介绍了如何在web.xml中配置ShiroFilter,包括核心组件securityManager的初始化和配置,以及如何通过spring的application.xml文件实现Realm、过滤器、缓存等组件的集成。同时,提供了ShiroRealm的基本代码实现,展示了如何通过UserService获取用户信息并进行权限验证。此外,还阐述了Shiro框架中常用的页面标签使用方法,以及如何在页面中实现用户认证、权限控制等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

好吧,shiro是真正意义上,自己学的一个新的东西……

写个文档记录下下。(好吧,我承认这是别人一直逼着我写的,唉。)


一、在web.xml配制shiroFilter

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <span style="white-space:pre">  </span><filter>  
  2.         <filter-name>shiroFilter</filter-name>  
  3.         <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>  
  4.     </filter>  
  5.     <filter-mapping>  
  6.         <filter-name>shiroFilter</filter-name>  
  7.         <url-pattern>*.do</url-pattern>  
  8.     </filter-mapping>  
二、在spring的application.xml中添加配制,缓存配制暂未使用
[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <span style="white-space:pre">  </span><!--securityManager是shiro的核心,初始化时协调各个模块运行-->  
  2.     <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">  
  3.         <!--单个realm使用realm,如果有多个realm,使用realms属性代替-->  
  4.         <property name="realm" ref="shiroRealm" />  
  5.         <!-- <property name="cacheManager" ref="shiroEhcacheManager" /> -->  
  6.     </bean>  
  7.   
  8.     <!--realm配置,realm是shiro的桥梁,它主要是用来判断subject是否可以登录及权限等-->  
  9.     <bean id="shiroRealm" class="com.shiro.realm.ShiroRealm">  
  10.         <property name="userService" ref="userService" />  
  11.     </bean>  
  12.     <bean id="userService" class="com.shiro.service.UserService" />  
  13.       
  14.     <!--shiro过滤器配置,bean的id值须与web中的filter-name的值相同-->  
  15.     <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">  
  16.         <property name="securityManager" ref="securityManager" />  
  17.         <!-- 没有权限或者失败后跳转的页面 -->  
  18.         <property name="loginUrl" value="/index.jsp" />  
  19.         <property name="successUrl" value="/loginSuccess.jsp" />  
  20.         <property name="unauthorizedUrl" value="" />  
  21.         <property name="filterChainDefinitions">  
  22.             <value>  
  23.                 /logout.do = logout  
  24.                 /user/** = authc  
  25.                 /admin/** = authc,roles[admin]  
  26.             </value>  
  27.         </property>  
  28.     </bean>  
  29.       
  30.     <!-- 用户授权/认证信息Cache, 采用EhCache 缓存 -->  
  31.     <!--   
  32.     <bean id="shiroEhcacheManager" class="org.apache.shiro.cache.ehcache.EhCacheManager">  
  33.         <property name="cacheManagerConfigFile" value="/WEB-INF/ehcache-shiro.xml" />  
  34.     </bean>   
  35.     -->  
  36.       
  37.     <!-- 保证实现了Shiro内部lifecycle函数的bean执行 -->    
  38.     <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>    
  39.         
  40.     <!-- AOP式方法级权限检查  -->  
  41.     <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor">    
  42.         <property name="proxyTargetClass" value="true" />    
  43.     </bean>    
  44.       
  45.     <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">    
  46.         <property name="securityManager" ref="securityManager"/>    
  47.     </bean>  

三、ShiroRealm文件基本代码

ShiroRealm extends AuthorizingRealm

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. /**  
  2.   * 授权查询回调函数, 进行鉴权但缓存中无用户的授权信息时调用.  
  3.   */    
  4.  @SuppressWarnings("unused")  
  5.  @Override  
  6.  protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection p) {  
  7.   
  8.      logger.info("授权认证:" + p.getRealmNames());    
  9.          
  10.      ShiroUser shiroUser = (ShiroUser)p.getPrimaryPrincipal();    
  11.      User user = userService.getUserByName(shiroUser.loginName);    
  12.   
  13.      SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();  
  14.      for (Role role : user.getRoles()) {  
  15.          //基于用户名的角色信息    
  16.          info.addRole(role.getName());    
  17.          //基于角色的权限信息    
  18.          info.setStringPermissions(role.getPermissions());    
  19.      }    
  20.      return info;    
  21.          
  22.  }  
[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1.   
[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1.    /**  
  2.      * 认证回调函数,登录时调用.  
  3.      */    
  4.     @Override    
  5.     protected AuthenticationInfo doGetAuthenticationInfo(    
  6.             AuthenticationToken authcToken) throws AuthenticationException {    
  7.         logger.info("authc pass:");    
  8.         UsernamePasswordToken token = (UsernamePasswordToken) authcToken;    
  9.         logger.info("authc name:" + token.getUsername());    
  10.         User user = userService.getUserByName(token.getUsername());    
  11.         if (user != null) {  
  12.     
  13.             logger.info("authc name:" + token.getUsername() + " user:"    
  14.                     + user.getName() + " pwd:" + user.getPwd()   
  15.                     + "getname:" + getName());    
  16.     
  17.             return new SimpleAuthenticationInfo(new ShiroUser(user.getName(), user.getName()),                     
  18.                     user.getPwd(), getName());    
  19.         }    
  20.         return null;    
  21.     }  
四、User与Role实体(用户关联角色,角色关联权限的关系,个人习惯,可自行配制其他方式)
[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. User  
  2.     private String name;  
  3.     private String pwd;  
  4.     private List<Role> roles;  
  5.   
  6. Role  
  7.     private String name;  
  8.     private Set<String> permissions;  

五、页面shiro常用标签的使用

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>  
  2.   
  3. <shiro:guest>//未登录</shiro:guest>  
  4.   
  5. <shiro:user>//当前有用户登录  
  6.     <shiro:principal />//当前登录用户名  
  7. </shiro:user>  
  8.   
  9. <shiro:hasRole name="admin">//角色为admin</shiro:hasRole>  
  10.   
  11. <shiro:hasPermission name="insert">//具有insert权限</shiro:hasPermission>  
[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <pre code_snippet_id="105013" snippet_file_name="blog_20131209_9_6571876"></pre>  
  2. <pre></pre>  
  3. <pre></pre>  
  4.       
  5.         <div style="padding-top:20px">           
  6.             <p style="font-size:12px;">版权声明:本文为博主原创文章,未经博主允许不得转载。</p>  
  7.         </div> 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值