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

    前言:

    shiro因为其简单、可靠、实现方便而成为现在最常用的安全框架,那么这篇文章除了会用简洁明了的方式讲一下基于spring的shiro详细配置和登录注销功能使用之外,也会根据惯例在文章最后总结一下shiro的大致配置使用流程,希望本篇文章能够后能给大家一种原来shiro这么简单的错觉感觉。

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

    一、依赖的jar包

    本篇文章使用shiro-1.4.0版本

    1、shiro官方下载地址:http://shiro.apache.org/download.html

    2、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以及这两个包所依赖的项。

    二、基于spring的配置方式

    1、配置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>  



    2、基于spring的shiro配置

    注意事项:spring在加载上下文的时候,是没有扫描注解的,由于我们在自定义的realm中用到了spring的注解,所以需要在shiro的自定义realm之前进行注解扫描。

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

    (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)。

    过滤器里可以配置注释里写的很清楚,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.     }  



    三、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.     }  

    四、shiro配置使用总结

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

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

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

    3、shiro提供了完整的登录流程和注销流程,对原有登录和注销流程做一定修改是免不了的。

    以上,希望对大家有所帮助。-- 做好自己--eguid

  • 相关阅读:
    无休止的项目,何来快感!!
    [From HTTP to AWS][4]使用LibcURL with OpenSSL support
    [From HTTP to AWS][2]Analyze TCP/IP Packets
    The setup of Piaoger
    从Adobe Subscription editions扯到破坏性创新
    SaaS窘境[欣赏然后翻译之]
    Algodoo,很棒的物理引擎
    浮水法POJ2528
    蛤的旅行
    题解 CF712A 【Memory and Crow】
  • 原文地址:https://www.cnblogs.com/eguid/p/7376690.html
Copyright © 2011-2022 走看看