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

摘要:
--Shiro的生命周期处理器--˃˂!

前言:

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

免责声明:文章转载自《简单两步快速实现shiro的配置和使用,包含登录验证、角色验证、权限验证以及shiro登录注销流程(基于spring的方式,使用maven构建)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Node.js中的模块接口module.exports浅析【转】CSS浏览器兼容性与解析问题终极归纳下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Spring boot如何快速的配置多个Redis数据源

简介 redis 多数据源主要的运用场景是在需要使用多个redis服务器或者使用多个redis库,本文采用的是fastdep依赖集成框架,快速集成Redis多数据源并集成lettuce连接池,只需引入依赖后在yaml文件中配置多数据源连接信息即可。 源码地址 希望大家可以star支持一下,后续还会加入其它依赖的简易整合。https://github.com...

SpringBoot---基本了解

什么是 Spring Boot?   Spring Boot 是 Spring 开源组织下的子项目,是 Spring 组件一站式解决方案,主要是简化了使用 Spring 的难度,简省了繁重的配置,提供了各种启动器,开发者能快速上手。Spring Boot 的最大的优势是“约定优于配置“ SpringBoot约定优于配置的体现   一、Maven的目录结构...

spring获取webapplicationcontext,applicationcontext几种方法详解[转载]

方法一:在初始化时保存ApplicationContext对象 代码: ApplicationContext ac = new FileSystemXmlApplicationContext("applicationContext.xml"); ac.getBean("beanId"); 或者通过classpath 路径获取 ApplicationCont...

springboot-使用assembly进行项目打包

一、相关依赖 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version&g...

WebSocket 详解教程

目录   概述  WebSocket 客户端  WebSocket 服务端  WebSocket 代理  FAQ  完整示例  资料 概述 WebSocket 是什么? WebSocket 是一种网络通信协议。RFC6455 定义了它的通信标准。 WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。 为什么...

SSH框架总结

首先,SSH不是一个框架,而是多个框架(struts+spring+hibernate)的集成,是目前较流行的一种Web应用程序开源集成框架,用于构建灵活、易于扩展的多层Web应用程序。 集成SSH框架的系统从职责上分为四层:表示层、业务逻辑层、数据持久层和域模块层(实体层)。 Struts作为系统的整体基础架构,负责MVC的分离,在Struts框架的模...