关键词:
Shiro
一、什么是Shiro
Apache Shiro是Java的一个安全(权限)框架
作用:认证、授权、加密、会话管理、与web集成、缓存等
下载地址:http://shiro.apache.org/download.html
二、Shiro的架构
1)subject:可以与应用交互的“用户”
2)SecurityManager:相当于SpringMVC中的DispatcherServlet;是Spring的心脏,交互都由其控制。管理所有的subject且负责进行认证、授权、会话及缓存的管理。
3)Authenticator:负责subject认证,是一个扩展点,可自定义实现;可以使用认证策略(Authentication Strategy)即什么情况下算用户通过了认证。
4)Authorizer:授权器。决定是否有权限进行相应的操作。控制用户可以访问的有哪些
5)Realm:可以有一个或者多个,可以认为是安全实体数据源,即用于获取安全实体的,可以是JDBC实现,也可以是内存实现等等,由用户提供。
6)SessionManager:管理Session生命周期的组件。而Shiro并不仅仅可以在Webh环境,也可以用在普通的JavaSE环境
7)CacheManager:缓存控制器,用来管理如用户、角色、权限等的缓存
8)Cryptography:密码模块,Shiro提高了一些常见的加密组件用于如密码加密/解密
三、谈谈一些关键的位置
这里以结合springboot与mybatis的代码为例
<!-- shiro与spring整合的依赖 --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring</artifactId> <version>$shiro.version</version> </dependency> <!-- ali的数据库连接池 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>$druid.version</version> </dependency> <!-- mysql驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!-- springboot的mybatis启动器 --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>$mybatis.version</version> </dependency> </dependencies> <!-- fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>$fastjson.version</version> </dependency> <!-- springboot的web组件 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
package cn.zytao.taosir.user.config; import java.util.LinkedHashMap; import java.util.Map; import org.apache.shiro.spring.web.ShiroFilterFactoryBean; import org.apache.shiro.web.mgt.DefaultWebSecurityManager; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * Shiro的配置类 * @author taosir */ @Configuration public class ShiroConfig /** * 创建Realm */ @Bean(name="userRealm") public UserRealm getRealm() return new UserRealm(); /** * 创建DefaultWebSecurityManager * @param userRealm */ @Bean(name="securityManager") public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm) DefaultWebSecurityManager securityManager=new DefaultWebSecurityManager(); //关联realm securityManager.setRealm(userRealm); return securityManager; /** * 创建ShiroFilterFactoryBean */ @Bean public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager securityManager) ShiroFilterFactoryBean shiroFilterFactoryBean=new ShiroFilterFactoryBean(); //设置安全管理器 shiroFilterFactoryBean.setSecurityManager(securityManager); //添加Shiro内置过滤器 /** * Shiro内置过滤器,可以实现权限相关的拦截器 * 常用的过滤器: * anon:无需认证(登录)可以访问 * authc:必须认证才可以访问 * user:如果使用rememberMe的功能可以直接访问 * perms:该资源必须得到资源权限才可以访问 * role:该资源必须得到角色权限才可以访问 */ Map<String, String> filterMap= new LinkedHashMap<String,String>(); //修改拦截后跳转的请求路径 shiroFilterFactoryBean.setLoginUrl("/user/badRequest"); shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap); return shiroFilterFactoryBean;
package cn.zytao.taosir.user.config; import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.AuthenticationInfo; import org.apache.shiro.authc.AuthenticationToken; import org.apache.shiro.authc.SimpleAuthenticationInfo; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.realm.AuthorizingRealm; import org.apache.shiro.subject.PrincipalCollection; import org.springframework.beans.factory.annotation.Autowired; import cn.zytao.taosir.common.model.user.User; import cn.zytao.taosir.user.mapper.UserMapper; /** * 自定义的Realm程序 * @author taosir */ public class UserRealm extends AuthorizingRealm @Autowired private UserMapper userMapper; /** * 执行授权逻辑 */ @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) System.out.println("开始执行Shiro的授权方法..."); return null; /** * 执行认证逻辑 */ @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken arg0) throws AuthenticationException System.out.println("开始执行Shiro的认证方法..."); //编写Shiro判断逻辑,判断用户名和密码 //判断用户名是否存在 UsernamePasswordToken token=(UsernamePasswordToken)arg0; User user = userMapper.findByUsername(token.getUsername()); if(user==null) return null; //判断密码是否正确 return new SimpleAuthenticationInfo("",user.getPassword(),"");
主要就是这两个相关类的关联,代码为我的实现,注解已经说明了相关位置写什么内容
记得配上mybatis的配置
spring: datasource: url: jdbc:mysql://localhost:3306/taosir-user?useUnicode=true&characterEncoding=utf8 username: root password: root driver-class-name: com.mysql.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource mybatis: type-aliases-package: cn.zytao.taosir.common.model.user
package cn.zytao.taosir.user.service.impl; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.IncorrectCredentialsException; import org.apache.shiro.authc.UnknownAccountException; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.subject.Subject; import org.springframework.stereotype.Service; import cn.zytao.taosir.common.exception.BadRequestException; import cn.zytao.taosir.user.service.UserService; @Service public class UserServiceImpl implements UserService @Override public void checkLogin(String username,String password) /** * 使用Shiro编写认证操作 */ //获取Subject Subject subject=SecurityUtils.getSubject(); //封装用户数据 UsernamePasswordToken token=new UsernamePasswordToken(username,password); //执行登录方法 try subject.login(token); catch (UnknownAccountException e) //用户名不存在 throw new BadRequestException("该用户名不存在"); catch (IncorrectCredentialsException e) //密码错误 throw new BadRequestException("密码不正确"); catch (Exception e) throw new BadRequestException("由于未知错误登录失败,请联系管理员或稍后重试");
shiro学习总结----初识shiro(代码片段)
本系列内容大多总结自官网和张开涛的《跟我学Shiro》 一、shiro简介 1.1、shiro有什么用? shiro是一个功能强大使用简单的java安全框架,主要提供了五大功能: 1、认证:用户身份认证,也就是登陆;... 查看详情
shiro(代码片段)
...认证,授权,加密及会话管理的解决方案。ApacheShiro相当简单,对比SpringSecurity,可能没有SpringSecurity做的功能强大,但是在实际工作时可能并不需要那么复杂的东西,能更简单的解决项目问题就好了。Shiro不仅可以用在JavaSE环境... 查看详情
⭐图例结合超硬核讲解shiro⭐(代码片段)
shiro目录前言一、shiro简介二、shiro简单使用三、身份验证3.1.环境准备3.2.登录/退出四、shiro授权4.1.shiro授权的三种方式:4.2.实现4.3.自定义Realm进行授权五、与SpringBoot集成案例六、shiro各个拦截器对比及使用配置6.1.各种拦截器的特... 查看详情
springboot学习shiro快速入门及与springboot集成(代码片段)
目录1、Shiro简介1.1、Shiro是什么?1.2、有哪些功能?1.3、Shiro架构(外部)1.4、Shiro架构(内部)2、HelloWorld2.1、快速实践3、SpringBoot集成3.1、SpringBoot整合Shiro环境搭建3.2、Shiro实现登录拦截3.3、Shiro实现用户认证3.4、Shiro整合Mybati... 查看详情
shiro框架学习-6-shiro内置的filter过滤器及数据加解密(代码片段)
1. shiro的核心过滤器定义在枚举类DefaultFilter 中,一共有11个,配置哪个路径对应哪个拦截器进行处理////Sourcecoderecreatedfroma.classfilebyIntelliJIDEA//(poweredbyFernflowerdecompiler)//packageorg.apache.shiro.web.filter.mgt;importjava.util.LinkedHashMap;im... 查看详情
shiro的简单介绍(代码片段)
1.Shiro的简单配置1)获取ShiroFilterFactoryBean,作用是在执行相关操作前,先进行功能过滤,拦截所有请求,进入到shiro中进行认证与授权例如:设置一些拦截的请求//身份认证失败,则跳转到登录页面的配... 查看详情
shiro浅析:shiro的登录验证过程(代码片段)
对Shiro的验证过程进行简单的分析Shiro浅析:Shiro的登录验证过程shiro的登录验证是从Subject.login开始的Subjectsubject=SecurityUtils.getSubject();UsernamePasswordTokentoken=newUsernamePassword(username,password[,remenberme]);subject.login 查看详情
权限控制框架shiro简单介绍及配置实例
Shiro是什么ApacheShiro是一个非常易用的Java安全框架它能提供验证、授权、加密和Session控制。Shiro非常轻量级而且API也非常易于理解可以使用Shiro完成从APP到企业级应用的所有权限控制。宏观视图从宏观来看Shiro架构中有3个重要概... 查看详情
2shiro的认证(代码片段)
...iro的同学看到上面的图片也不明白,下面我们来在代码中尝试体验Shiro的认证过程:1.新建一个SpringBoot项目项目结构如下:ShiroframeApplicationTests代码:packagecom.shiro.shiroframe;importorg.apache.shiro.SecurityUtils;importor 查看详情
shiro系列:简单示例学习(代码片段)
在本示例中,使用INI文件来定义用户和角色.首先学习一下INI文件的规范. =======================ShiroINI的基本规范=======================[main]#在这里定义SecurityManager和Realms等[users]#每一行定义一个用户,格式是username=password,role1,role2,..... 查看详情
初识shiro
转载地址https://my.oschina.net/Tsher2015/blog/654993摘要:核心JAR包:shiro-core.jar1.shiro流程:1.1.使用数据源,也就是RealM初始化SecurityManagerFactory.1.2.得到SecurityManager(安全管理器).1.3.设置到SecutiryUtils.1.4.得到subject,使用认证服务.2.权 查看详情
shiro之realm及相关对象principalcollection(代码片段)
之前使用过的(来点印象)login("classpath:shiro-authenticator-all-success.ini");Subjectsubject=SecurityUtils.getSubject();//得到一个身份集合,其包含了Realm验证成功的身份信息PrincipalCollectionprincipalCollection=subject.getPrincipals();... 查看详情
003shiro的认证(代码片段)
一.概述 认证:简单说就是登录,用户携带账号和密码信息通过Subject对象与shiro进行交互,看用户的身份凭证是否正确. 本节需要演示认证的流程. 二.搭建环境 本次使用ini充当Realm对象,使用IniSecurityManager充当SecurityManage... 查看详情
shiro学习——shiro与web集成(代码片段)
...用的关键。这里以最基础的与servlet集成作为例子。新建简单的servlet应用这里以《Eclipse新建基于Servlet3.x的maven项目》这篇文章的方式构建基本的servlet,就不在本文叙述了。Servlet与Shiro集成在web.xml配置 查看详情
shiro学习——shiro与web集成(代码片段)
...用的关键。这里以最基础的与servlet集成作为例子。新建简单的servlet应用这里以《Eclipse新建基于Servlet3.x的maven项目》这篇文章的方式构建基本的servlet,就不在本文叙述了。Servlet与Shiro集成在web.xml配置 查看详情
shiro的简单介绍(代码片段)
1.Shiro的简单配置1)获取ShiroFilterFactoryBean,作用是在执行相关操作前,先进行功能过滤,拦截所有请求,进入到shiro中进行认证与授权例如:设置一些拦截的请求//身份认证失败,则跳转到登录页面的配... 查看详情
shiro之realm及相关对象authorizationinfo(代码片段)
AuthorizationInfo用于聚合授权信息的:publicinterfaceAuthorizationInfoextendsSerializable Collection<String>getRoles();//获取角色字符串信息 Collection<String>getStringPermissions();//获取权限字符串信息 Collection<Permission>getObjectPermissions();//... 查看详情
springboot整合shiro+jwt实现认证及权限校验(代码片段)
序言本文讲解如何使用SpringBoot整合Shiro框架来实现认证及权限校验,但如今的互联网已经成为前后端分离的时代,所以本文在使用SpringBoot整合Shiro框架的时候会联合JWT一起搭配使用。ShiroShiro是apache旗下一个开源框架,... 查看详情