`
wusuoya
  • 浏览: 629424 次
  • 性别: Icon_minigender_2
  • 来自: 成都
社区版块
存档分类
最新评论

Spring3与安全框架apache shiro的整合

    博客分类:
  • web
 
阅读更多

shiro是一个很不错的安全框架,相对Spring security 来说要简单易用的多,使用shiro来做web的权限子系统是不错的选择。

下面记录一下shiro和Spring整合的过程:

 

Applicationcontext-shiro.xml代码  收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.        xmlns:util="http://www.springframework.org/schema/util"  
  5.        xsi:schemaLocation="  
  6.        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
  7.        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd">  
  8.   
  9.     <description>Shiro 配置</description>  
  10.     <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">  
  11.         <property name="securityManager" ref="securityManager" />  
  12.         <property name="loginUrl" value="/login.jsp" />  
  13.         <property name="successUrl" value="/index.jsp" />  
  14.         <property name="unauthorizedUrl" value="/login.do" />  
  15.         <property name="filterChainDefinitions">  
  16.             <value>  
  17.                 /login.jsp = anon  
  18.                 /login.do = anon  
  19.                 /** = authc  
  20.                </value>  
  21.         </property>  
  22.     </bean>  
  23.   
  24.     <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">  
  25.         <!--设置自定义realm-->  
  26.         <property name="realm" ref="monitorRealm" />  
  27.     </bean>  
  28.   
  29.     <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />  
  30.       
  31.     <!--自定义Realm 继承自AuthorizingRealm-->  
  32.     <bean id="monitorRealm" class="***module.system.security.MonitorRealm"></bean>  
  33.     <!-- securityManager -->  
  34.     <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">  
  35.         <property name="staticMethod"  
  36.             value="org.apache.shiro.SecurityUtils.setSecurityManager" />  
  37.         <property name="arguments" ref="securityManager" />  
  38.     </bean>  
  39.       
  40.     <!-- Enable Shiro Annotations for Spring-configured beans.  Only run after -->  
  41.     <!-- the lifecycleBeanProcessor has run: -->  
  42.     <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor"/>  
  43.     <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">  
  44.     <property name="securityManager" ref="securityManager"/>  
  45.       
  46. </bean>  
  47. </beans>  

 

 

 

 

 

将shiro的配置文件引入到web.xml中:

 

 

 

 

 

 

 

并在web.xml中加入如下代码:

 

 

 

 

 

 

 

 

 

Xml代码  收藏代码
  1. <!-- Shiro Security filter -->  
  2.     <filter>  
  3.         <filter-name>shiroFilter</filter-name>  
  4.         <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>  
  5.         <init-param>  
  6.             <param-name>targetFilterLifecycle</param-name>  
  7.             <param-value>true</param-value>  
  8.         </init-param>  
  9.     </filter>  
  10.   
  11.     <filter-mapping>  
  12.         <filter-name>shiroFilter</filter-name>  
  13.         <url-pattern>*.do</url-pattern>  
  14.     </filter-mapping>  
  15.     <filter-mapping>  
  16.         <filter-name>shiroFilter</filter-name>  
  17.         <url-pattern>*.jsp</url-pattern>  
  18.     </filter-mapping>  

 

 

 

实现自己的Realm

 

 

 

Java代码  收藏代码
  1. @Service("monitorRealm")  
  2. public class MonitorRealm extends AuthorizingRealm {  
  3.       
  4.     @Autowired UserService userService;  
  5.     @Autowired RoleService roleService;  
  6.     @Autowired LoginLogService loginLogService;  
  7.       
  8.     public MonitorRealm(){  
  9.         super();  
  10.   
  11.     }  
  12.       
  13.     @Override  
  14.     protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {  
  15.         /*这里编写授权代码*/  
  16.           
  17.     }  
  18.   
  19.     @Override  
  20.     protected AuthenticationInfo doGetAuthenticationInfo(  
  21.             AuthenticationToken authcToken) throws AuthenticationException {  
  22.     /*这里编写认证代码*/  
  23.     }  
  24.       
  25.     public void clearCachedAuthorizationInfo(String principal) {  
  26.         SimplePrincipalCollection principals = new SimplePrincipalCollection(principal, getName());  
  27.         clearCachedAuthorizationInfo(principals);  
  28.     }  
  29.   
  30. }  

 

 

 

登录时的代码示例:

 

 

 

Java代码  收藏代码
  1. Subject currentUser = SecurityUtils.getSubject();  
  2.         if(!currentUser.isAuthenticated()){  
  3.             UsernamePasswordToken token;  
  4.             if(null == rememberMe)  
  5.                 token = new UsernamePasswordToken(user.getUsername(), EncryptUtils.encodeMD5String(user.getPassword()),false,request.getRemoteAddr());  
  6.             else token = new UsernamePasswordToken(user.getUsername(), EncryptUtils.encodeMD5String(user.getPassword()), true, request.getRemoteAddr());  
  7.             try {  
  8.                 currentUser.login(token);  
  9.             } catch ( AuthenticationException ae ) {  
  10.                 request.setAttribute("message""用户名或密码错误!");  
  11.                 return "login";  
  12.             }  
  13.         }  

 

 执行currentUser.login(token);这句代码时,shiro会自动调用用户实现的Realm的doGetAuthenticationInfo进行身份认证。

 

登出时的代码示例:

 

 

 

Java代码  收藏代码
  1. Subject currentUser = SecurityUtils.getSubject();  
  2.         if (currentUser != null) {  
  3.             currentUser.logout();  
  4.         }  
  5.         HttpSession session = request.getSession(false);  
  6.         if( session != null ) {  
  7.             session.invalidate();  
  8.         }  
  9.         return "login";  

 

 在对用户(角色)进行授权时会执行Realm里的doGetAuthorizationInfo方法。

 

 

 

OK简单的集成完成了,如果用cas或者Springsecurity恐怕没这么简单利索 哈哈。

 

 

 



 

类似功能链接:http://kdboy.iteye.com/blog/1103794

其它链接:

http://kdboy.iteye.com/blog/1154644

http://kdboy.iteye.com/blog/1154652

http://kdboy.iteye.com/blog/1155450

http://kdboy.iteye.com/blog/1169631

http://kdboy.iteye.com/blog/1169637

官方名词解释:http://shiro.apache.org/terminology.html

官方权限解释:http://shiro.apache.org/permissions.html

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics