(十二)springboot中shiro的使用
一、引入maven配置
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.4.0</version>
</dependency>
二、建表
用户表、角色表、权限表、用户角色表、角色权限表。
用户表:

角色表:

权限表:news:* 表示有新闻的所有权限(包括增删改查),而news:add,只有新闻的新增权限。

用户角色表:用户拥有哪些角色。

角色权限表:角色拥有哪些权限。

三、自定义Realm
自定义realm主要用于用户的权限验证以及登录验证。
自定义realm继承AuthorizingRealm类,并重写doGetAuthorizationInfo和doGetAuthenticationInfo方法,doGetAuthorizationInfo方法主要校验用户的权限,即该用户拥有什么角色以及权限。doGetAuthenticationInfo用于校验登录验证,即用户的用户名或者密码是否正确。
/**
* 类名 : shiro的Realm
* 用法 :
* 创建人 : shyroke
* 时间:2018/12/12 17:29
*/
public class MyRealm extends AuthorizingRealm { @Autowired
private UserMapper userMapper; @Autowired
private PermissionMapper permissionMapper; /**
* 授权,即该用户拥有什么角色以及权限
* 步骤:根据用户名获取角色以及权限,然后设置到验证信息类并返回。
* @param principalCollection
* @return
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); String userName = principalCollection.getPrimaryPrincipal().toString(); // 获取该用户的角色
List<Role> roles = userMapper.getRolesByUserName(userName);
Set<String> roleSets = new HashSet<>(); // 获取该用户的权限集
List<Permission> permissions = new ArrayList<>();
Set<String> permissoinSet = new HashSet<>(); //将List转为Set
if(roles !=null && roles.size()>0){
for(Role role:roles){
roleSets.add(role.getName());
permissions.addAll(permissionMapper.getPermissionByRoleId(role.getId()));
}
} //将List转为Set
if(permissions!=null & permissoinSet.size()>0){
for(Permission p :permissions){
permissoinSet.add(p.getName());
}
} info.addRoles(roleSets);
info.addStringPermissions(permissoinSet); return info;
} /**
* 认证,即用户账号密码是否正确
* @param token
* @return
* @throws AuthenticationException
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
// 获取用户名和密码
String userName = (String)token.getPrincipal();
String passWord = new String((char[]) token.getCredentials()); // 根据用户名查找该用户
User user = userMapper.getUserByName(userName); if(user == null){
throw new UnknownAccountException("用户名不存在");
} if(!user.getPassword().equals(passWord)){
throw new IncorrectCredentialsException("密码错误");
} SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user.getName(),user.getPassword(),getName()); return info;
}
}
四、shiro配置类
/**
* 类名 :shiro的核心配置类
* 用法 :
* 创建人 : shyroke
* 时间:2018/12/14 15:20
*/
@Configuration
public class ShiroConfigration { // 设置自定义Realm
@Bean
public MyRealm myRealm(){
return new MyRealm();
} // 权限管理,配置主要是Realm的管理认证
@Bean
public SecurityManager securityManager(){
DefaultWebSecurityManager manager = new DefaultWebSecurityManager();
manager.setRealm(myRealm());
return manager;
} /**
* 设置过滤条件和跳转条件
* anon 不生效的原因:1、map的类型必须是LinkedHashMap 2、anon必须定义在authc之前
*
* @param securityManager
* @return
*/
@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager){
ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
factoryBean.setSecurityManager(securityManager); // 设置登录跳转
factoryBean.setLoginUrl("/admin");
factoryBean.setSuccessUrl("/admin/index"); //必须为LinkedHashMap 否则anon不生效
Map<String,String> map = new LinkedHashMap<>(); //退出
map.put("/admin/logout","logout"); //登录页面和登录验证不要拦截
map.put("/admin/login.html","anon");
map.put("/admin/tologin","anon"); //设置需要过滤的链接
map.put("/admin/**","authc"); factoryBean.setFilterChainDefinitionMap(map); return factoryBean;
} /**
* 开启Shiro的注解(如@RequiresRoles,@RequiresPermissions),需借助SpringAOP扫描使用Shiro注解的类,并在必要时进行安全逻辑验证
* 配置以下两个bean(DefaultAdvisorAutoProxyCreator和AuthorizationAttributeSourceAdvisor)即可实现此功能
* @return
*/
@Bean
public DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator(){
DefaultAdvisorAutoProxyCreator advisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
advisorAutoProxyCreator.setProxyTargetClass(true);
return advisorAutoProxyCreator;
} /**
* 开启aop注解支持
* @param securityManager
* @return
*/
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
return authorizationAttributeSourceAdvisor;
} }
五、调用
代码如下,当调用Subject.login方法后,会调用自定义Realm的doGetAuthenticationInfo方法校验用户名密码是否正确,如果不正确则抛出对应异常,controller层捕获并处理异常。
AuthenticationToken usernamePasswordToken = new UsernamePasswordToken(user.getName(),user.getPassword());
Subject subject = SecurityUtils.getSubject();
try {
subject.login(usernamePasswordToken);
}catch (UnknownAccountException ex) {
logger.info("用户名错误!");
return R.error("用户名错误!");
} catch (IncorrectCredentialsException ex) {
logger.info("密码错误!");
return R.error("密码错误!");
} catch (AuthenticationException ex) {
logger.info(ex.getMessage());
return R.error("系统错误,请查看日志");
} catch (Exception ex) {
logger.info(ex.getMessage());
return R.error("系统错误,请查看日志");
}
(十二)springboot中shiro的使用的更多相关文章
- (转)SpringMVC学习(十二)——SpringMVC中的拦截器
http://blog.csdn.net/yerenyuan_pku/article/details/72567761 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter, ...
- OpenJDK源码研究笔记(十二):JDBC中的元数据,数据库元数据(DatabaseMetaData),参数元数据(ParameterMetaData),结果集元数据(ResultSetMetaDa
元数据最本质.最抽象的定义为:data about data (关于数据的数据).它是一种广泛存在的现象,在许多领域有其具体的定义和应用. JDBC中的元数据,有数据库元数据(DatabaseMeta ...
- SpringBoot中Shiro缓存使用Redis、Ehcache
在SpringBoot中Shiro缓存使用Redis.Ehcache实现的两种方式实例 SpringBoot 中配置redis作为session 缓存器. 让shiro引用 本文是建立在你是使用这sh ...
- SpringBoot中Shiro使用Pac4j集成CAS认证
SpringBoot中Shiro使用Pac4j集成CAS认证 Pac4j 简介 Pac4j与Shiro,Spring Security一样都是权限框架,并且提供了OAuth - SAML - CAS ...
- springboot系列(十)springboot整合shiro实现登录认证
关于shiro的概念和知识本篇不做详细介绍,但是shiro的概念还是需要做做功课的要不无法理解它的运作原理就无法理解使用shiro: 本篇主要讲解如何使用shiro实现登录认证,下篇讲解使用shiro ...
- (十二)整合 Shiro 框架,实现用户权限管理
整合 Shiro 框架,实现用户权限管理 1.Shiro简介 1.1 基础概念 1.2 核心角色 1.3 核心理念 2.SpringBoot整合Shiro 2.1 核心依赖 2.2 Shiro核心配置 ...
- [十二]SpringBoot 之 servlet
Web开发使用 Controller 基本上可以完成大部分需求,但是我们还可能会用到 Servlet.Filter.Listener.Interceptor 等等. 当使用spring-Boot时,嵌 ...
- 十二.spring-boot使用spring-boot-freemarker
①.在springMVC中:它代表着view层组件 ②.为什么使用freemarker:简单容易学.逻辑分明 ③.freemarker优点:它不依赖servlet.网络或者web环境 一.创建一个ma ...
- Expo大作战(十二)--expo中的自定义样式Custom font,以及expo中的路由Route&Navigation
简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...
随机推荐
- 《MVC架构下网站的设计与实现》论文笔记(十八)
标题:MVC架构下网站的设计与实现 一.基本信息 时间:2017 来源:广东海洋大学数学与计算机学院 关键词:网站设计:MVC 框架:数据库:网络安全 二.研究内容 1.系统的整体架构设计(以广东海洋 ...
- SDOI2012 走迷宫
走迷宫 Morenan被困在了一个迷宫里.迷宫可以视为N个点M条边的有向图,其中Morenan处于起点S,迷宫的终点设为T.可惜的是,Morenan非常的脑小,他只会从一个点出发随机沿着一条从该点出发 ...
- JSOI2009 等差数列 和 算术天才⑨与等差数列 和 CH4302 Interval GCD
等差数列 为了检验学生的掌握情况,jyy布置了一道习题:给定一个长度为N(1≤N≤100,000)的数列,初始时第i个数为vi(vi是整数,−100,000≤vi≤100,000),学生们要按照jyy ...
- ubuntu18docker下安装MySQL
sudo docker run –name mysqldb -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root-d mysql:latest 这里的容器名字叫:mysql ...
- 通过jar包名称,获取maven的依赖信息GAV
烦恼:当我们手上有一堆三方件jar包,想要转成maven管理时,需要一个一个配置进pom文件中,而且GAV信息还得去收集. 为了快速生成如下信息,我们可以这样.... GAV:groupId + ar ...
- ThreadLocal如何回收value,什么时候回收?(学习笔记)
1)ThreadLocal如何回收value,什么时候回收?从ThreadLocal中的内部类分析:① static class ThreadLocalMap { /** * The entries ...
- 华三IRF配置
配置步骤: IRF的配置步骤: 1.配置IRF域(域ID=10.成员ID.优先级) irf domain 10irf member 1 priority 10irf member 2 priority ...
- vector的使用注意事项
示例1: #include "iostream" #include "vector" using namespace std; int main(void) { ...
- js处理事件冒泡(兼容写法)
event = event || window.event; if (event.stopPropagation) { event.stopPropagation(); } else { event. ...
- vsftp上传553 Could not create file错误解决
可以正常连接,可是上传文件是提示553 Could not create file无法创建文件. 权限不足,从根目录开始检查保证每个文件夹都有777的权限,就可以正常上传.