简单两步快速实现shiro的配置和使用,包含登陆验证、角色验证、权限验证以及shiro登陆注销流程(基于spring的方式,使用maven构建)

前言:html

shiro由于其简单、可靠、实现方便而成为如今最经常使用的安全框架,那么这篇文章除了会用简洁明了的方式讲一下基于spring的shiro详细配置和登陆注销功能使用以外,也会根据惯例在文章最后总结一下shiro的大体配置使用流程,但愿本篇文章可以后能给你们一种原来shiro这么简单的错觉感受。java

注意:该篇文章的开始是创建在一个完备的spring+mybatis的开发环境中,除了shiro以外的配置基本不会涉及到。作好本身--eguid原创文章web

1、依赖的jar包

本篇文章使用shiro-1.4.0版本spring

一、shiro官方下载地址:http://shiro.apache.org/download.htmlapache

二、maven依赖项:数组

 

[html]  view plain  copy
 
 print?
  1. <dependency>  
  2.     <groupId>org.apache.shiro</groupId>  
  3.     <artifactId>shiro-spring</artifactId>  
  4.     <version>1.4.0</version>  
  5. </dependency>  


为何maven只须要shiro-spring这个依赖项就好了,由于shiro-spring依赖shiro-core和shiro-web两个包,因此会自动继承shiro-core和shiro-web以及这两个包所依赖的项。安全

 

2、基于spring的配置方式

一、配置shiro过滤器

 

[html]  view plain  copy
 
 print?
  1. <!-- shiro过滤器 -->  
  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.     <filter-mapping>  
  11.         <filter-name>shiroFilter</filter-name>  
  12.         <url-pattern>/*</url-pattern>  
  13.     </filter-mapping>  



 

二、基于spring的shiro配置

 

注意事项:spring在加载上下文的时候,是没有扫描注解的,因为咱们在自定义的realm中用到了spring的注解,因此须要在shiro的自定义realm以前进行注解扫描。session

<context:component-scan base-package="cc.eguid" />mybatis

(1)spring下的shiro完整配置

 

[html]  view plain  copy
 
 print?
  1. <!-- shiro的生命周期处理器 -->  
  2.     <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />  
  3.   
  4.     <!-- 使用shiro安全检查注解 -->  
  5.     <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor" />  
  6.     <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">  
  7.         <property name="securityManager" ref="securityManager" />  
  8.     </bean>  
  9.       
  10.     <!-- 自定义的安全数据源,用来实现自定义的登陆验证、角色验证、权限验证 -->  
  11.     <bean id="myRealm" class="cc.eguid.shiro.MyRealm"/>  
  12.     <!-- 安全管理器 -->  
  13.     <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">  
  14.         <property name="realm" ref="myRealm" />  
  15.     </bean>  
  16.     <!-- shiro过滤器 -->  
  17.     <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">  
  18.         <!-- 配置安全管理器 -->  
  19.         <property name="securityManager" ref="securityManager" />  
  20.         <!-- 身份认证失败跳转的地址,没有登陆固然就跳转到登陆地址 -->  
  21.         <property name="loginUrl" value="/login/" />  
  22.         <!-- 身份认证成功跳转的地址,通常登陆成功后会跳转到系统首页 -->  
  23.         <property name="successUrl" value="/" />  
  24.         <!-- 权限认证失败跳转的地址 ,用来提示当前用户没有操做权限,能够不须要-->  
  25.         <property name="unauthorizedUrl" value="/login/unauthorized" />  
  26.         <property name="filterChainDefinitions">  
  27.             <!--anon 表示匿名访问,不须要认证以及受权 -->  
  28.             <!--authc表示须要认证 没有进行身份认证是不能进行访问的 -->  
  29.             <!--authc,roles[admin]表示是admin角色的用户才能访问 -->  
  30.             <value>  
  31.                 /* = authc  
  32.                 /static/** =anon  
  33.                 /login/** = anon  
  34.                 /admin/** = authc,roles[admin]  
  35.                 /camera/** = authc  
  36.                 /** = authc  
  37.             </value>  
  38.         </property>  
  39.     </bean>  


这段配置须要修改的只有shiro过滤器和shiro安全数据源(realm)。app

 

过滤器里能够配置注释里写的很清楚,anon表示匿名访问,authc表示须要进行登陆验证、权限验证、角色验证

自定义realm实现请看下面。

(2)自定义的realm安全数据源

 

[java]  view plain  copy
 
 print?
  1. public class MyRealm extends AuthorizingRealm{  
  2.     Logger log=Logger.getLogger(MyRealm.class);  
  3.       
  4.     @Autowired  
  5.     private UserService userService;//这是本身实现的用户信息操做类,实现用户信息,用户角色信息、用户权限信息查询功能  
  6.   
  7.     @Override  
  8.     protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {  
  9.         log.info("从登陆凭证中获取用户信息,因为咱们在doGetAuthenticationInfo中直接在principals中存放的用户信息对象,因此咱们能够得到当前用户信息");  
  10.         UserInfo user = (UserInfo) principals.getPrimaryPrincipal();  
  11.         SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();  
  12.         // 查询角色信息  
  13.         Collection<String> roles = userService.findRoles(user);  
  14.         log.info("查询用户角色信息并添加到shiro权限验证器中,一个用户能够对应多个角色");  
  15.         info.addRoles(roles);  
  16.         // 查询权限信息  
  17.         Collection<String> permissions = userService.findPermissions(user);  
  18.         log.info("把用户权限信息添加到shiro权限过滤器中");  
  19.         info.addStringPermissions(permissions);  
  20.         return info;  
  21.     }  
  22.   
  23.     @Override  
  24.     protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token)throws AuthenticationException{  
  25.         log.info("shiro登陆验证");  
  26.         // 在咱们本身的登陆流程中应该确保登陆的用户信息已经插入AuthenticationToken中,这样才能经过shiro的认证流程  
  27.         String loginname= token.getPrincipal().toString();  
  28.         //虽然在登陆流程中咱们给的是String的面,可是shiro中已经写死了密码是个字符数组,因此老老实实的把密码转成char[]吧  
  29.         char[] password=(char[]) token.getCredentials();  
  30.         // 查询用户名对应的用户信息  
  31.         UserInfo user =userService.queryUserInfoByLoginName(loginname);  
  32.         log.info("验证用户信息:"+loginname+","+user+"密码:"+password);  
  33.         if (user != null&&user.getPassword()!=null) {  
  34.             //直接把用户信息对象和密码塞进shiro验证器,shiro会自动判断密码是否正确  
  35.             AuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(user, password, getName());  
  36.             return authenticationInfo;  
  37.         }  
  38.         return null;  
  39.     }  



 

3、shiro登陆和注销流程实现

 

[java]  view plain  copy
 
 print?
  1. /** 
  2.      * shiro注销,shiro会自动把session释放,因此不须要调用session.invalidate();方法 
  3.      */  
  4.     @Override  
  5.     public void logout(){  
  6.         Subject currentUser = SecurityUtils.getSubject();         
  7.         <span style="white-space:pre">  </span>currentUser.logout();  
  8.         
  9.     }  
  10.     /** 
  11.      * shiro登陆 
  12.      */  
  13.     @Override  
  14.     public boolean singin(UserInfo user){  
  15.         try{  
  16.             Subject subject = SecurityUtils.getSubject() ;  
  17.             <span style="white-space:pre">  </span>UsernamePasswordToken token = new UsernamePasswordToken(user.getLoginusername(),user.getPassword()) ;  
  18.             subject.login(token);  
  19.             log.info("shiro登陆验证成功");  
  20.             return true;  
  21.         }catch(AuthenticationException e){  
  22.             log.error("shiro登陆验证不经过",e);  
  23.             return false;  
  24.         }  
  25.     }  
  26.   
  27.     /** 
  28.      * 判断用户是否登陆(shiro方式) 
  29.      */  
  30.     @Override  
  31.     public boolean isSignon() {  
  32.         Subject subject = SecurityUtils.getSubject() ;  
  33.         return subject.isAuthenticated();  
  34.     }  

 

 

 

4、shiro配置使用总结

一、在web.xml中配置shiro的过滤器

二、在spring应用上下文(例如:applicationContext.xml)中配置shiro过滤器及自定义realm等其余辅助配置,其中

shiro过滤器能够配置哪些接口须要进行登陆验证、角色验证、权限验证,哪些不须要进行验证,自定义realm则是为shiro验证器提供了用户信息、用户角色信息和用户权限信息等数据源,进而让shiro进行三项验证。

三、shiro提供了完整的登陆流程和注销流程,对原有登陆和注销流程作必定修改是免不了的。

以上,但愿对你们有所帮助。-- 作好本身--eguid

相关文章
相关标签/搜索