Shiro简介

Apache Shiro是一个功能强大且易于使用的Java安全框架,用于执行身份验证,授权,加密和会话管理。使用Shiro易于理解的API,您可以快速轻松地保护任何应用程序-从最小的移动应用程序到最大的Web和企业应用程序。

SpringBoot常用的权限管理框架主要有Shiro和Spring Security,相对来讲,Shiro的使用要更加简单。本文主要介绍SpringBoot与Shiro的集成与初步使用。

pom.xml引入

<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.5.1</version>
</dependency>

LoginController

@RestController
public class LoginController { @RequestMapping(value = "/login", method = RequestMethod.POST)
public Results login(String username, String password){
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
//是否记住用户
//token.setRememberMe(true); // 执行登录方法
// 无异常则判断为登录成功
try{
subject.login(token);
}catch (UnknownAccountException e){
return Results.failure(ResponseCode.NULL_USERNAME);
}catch (IncorrectCredentialsException e){
return Results.failure(ResponseCode.WRONG_PASSWORD);
}
return Results.success();
}
}

Shiro中Subject代指用户对象,subject.login(token)既用户登录操作,这个方法将执行对应的认证与授权逻辑,它可能抛出两个异常:UnknownAccountException与IncorrectCredentialsException,分别为用户不存在和密码错误,无异常则判断登录成功。在这里我用自己的Results类对结果进行了封装。

ShiroConfig

@Configuration
public class ShiroConfig { //创建ShiroFilterFactoryBean
@Bean
public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager")DefaultWebSecurityManager securityManager){
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); //设置SecurityManager
shiroFilterFactoryBean.setSecurityManager(securityManager); Map<String, String> filterMap = new LinkedHashMap<>();
//无需登录
filterMap.put("/login", "anon"); //需要登录
filterMap.put("/user/**", "authc"); //需要特定权限
filterMap.put("/druid/stat", "roles[druid]"); shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap); //修改认证失败的跳转页面
shiroFilterFactoryBean.setLoginUrl("/401");
shiroFilterFactoryBean.setUnauthorizedUrl("/403"); return shiroFilterFactoryBean;
} //创建DefaultWebSecurityManager
@Bean(name="securityManager")
public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm){
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
//关联realm
securityManager.setRealm(userRealm);
return securityManager;
} // 创建Realm
@Bean(name="userRealm")
public UserRealm getUserRealm(){
return new UserRealm();
}
}

Shiro通过ShiroFilterFactoryBean来实现对URL的权限过滤,ShiroFilterFactoryBean允许接收一个Map<String, String>用于设置过滤规则,该Map的键对应需要过滤的URL,可使用通配符。该Map的值对应过滤器,常用的过滤器有:

  1. anno:无需认证
  2. authc:需要认证
  3. user:使用RememberMe功能可以直接访问
  4. perms:该资源必须得到对应资源权限才可以访问
  5. roles:该资源必须得到对应角色权限才可以访问

我们通过传入自定义的Reaml来控制对不同用户的权限管理。

UserRealm

public class UserRealm extends AuthorizingRealm {

    @Autowired
SysUserService sysUserService; private SysUser user; @Override
//执行授权逻辑
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); //根据用户身份授权
if(user.getUsername().equals("zzZ")){
info.addRole("druid");
// info.addRoles(Permissions.adminPerms);
} // 添加身份权限
//info.addRole("structure:query");
return info;
} @Override
//执行认证逻辑
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token1) throws AuthenticationException { UsernamePasswordToken token = (UsernamePasswordToken)token1; //查询数据库验证用户身份
String currentUsername = token.getUsername();
user = sysUserService.getSimpleUserByName(currentUsername); // 用户不存在
if(user==null){return null; } String password = user.getPassword();
return new SimpleAuthenticationInfo(user, password, "");
}
}

编写一个自定义的UserRealm类用于执行认证与授权逻辑,这个类继承自AuthorizingRealm,重写了两个方法:

  1. doGetAuthorizationInfo: 用于执行授权逻辑
  2. doGetAuthenticationInfo: 用于执行认证逻辑,通常通过查询数据库实现。

获取当前用户

SysUser user = (SysUser) SecurityUtils.getSubject().getPrincipal();

通过SecurityUtils.getSubject()方法可以获取当前用户,在Service或Controller层中可以通过当前用户身份信息实现相关逻辑。

SpringBoot集成Shiro实现权限控制的更多相关文章

  1. springboot集成shiro 实现权限控制(转)

    shiro apache shiro 是一个轻量级的身份验证与授权框架,与spring security 相比较,简单易用,灵活性高,springboot本身是提供了对security的支持,毕竟是自 ...

  2. springboot集成shiro实现权限认证

    github:https://github.com/peterowang/shiro 基于上一篇:springboot集成shiro实现身份认证 1.加入UserController package ...

  3. SpringBoot整合Shiro实现权限控制,验证码

    本文介绍 SpringBoot 整合 shiro,相对于 Spring Security 而言,shiro 更加简单,没有那么复杂. 目前我的需求是一个博客系统,有用户和管理员两种角色.一个用户可能有 ...

  4. SpringBoot整合Shiro实现权限控制

    目录 1.SpringBoot整合Shiro 1.1.shiro简介 1.2.代码的具体实现 1.2.1.Maven的配置 1.2.2.整合需要实现的类 1.2.3.项目结构 1.2.4.ShiroC ...

  5. springboot集成shiro实现权限缓存和记住我

    到这节为止,我们已经实现了身份验证和权限验证.但是,如果我们登录之后多次访问http://localhost:8080/userInfo/userDel的话,会发现权限验证会每次都执行一次.这是有问题 ...

  6. SpringBoot集成Shiro 实现动态加载权限

    一.前言 本文小编将基于 SpringBoot 集成 Shiro 实现动态uri权限,由前端vue在页面配置uri,Java后端动态刷新权限,不用重启项目,以及在页面分配给用户 角色 . 按钮 .ur ...

  7. SpringBoot集成Shiro并用MongoDB做Session存储

    之前项目鉴权一直使用的Shiro,那是在Spring MVC里面使用的比较多,而且都是用XML来配置,用Shiro来做权限控制相对比较简单而且成熟,而且我一直都把Shiro的session放在mong ...

  8. SpringBoot学习笔记(五):SpringBoot集成lombok工具、SpringBoot集成Shiro安全框架

    SpringBoot集成lombok工具 什么是lombok? 自动生成setget方法,构造函数,打印日志 官网:http://projectlombok.org/features/index. 平 ...

  9. SpringBoot与Shiro整合权限管理实战

    SpringBoot与Shiro整合权限管理实战 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] *观看本文章需要有一定SpringBoot整合经验* Shiro框架简介 Apach ...

随机推荐

  1. 文献名:Repeat-Preserving Decoy Database for False Discovery Rate Estimation in Peptide Identication (用于肽段鉴定中错误发生率估计的能体现重复性的诱饵数据库)

    文献名:Repeat-Preserving Decoy Database for False Discovery Rate Estimation in Peptide Identication (用于 ...

  2. Python第四章-流程控制

    流程控制 在以前的代码中,所有的代码都是交由 Python 忠实地从头执行到结束.但是这些远远不够.很多时候需要根据不同的情况执行不同的代码. 如果你想改变这一工作流程,应该怎么做? 就像这样的情况: ...

  3. UVA11987 Almost Union-Find 并查集的节点删除

    题意: 第一行给出一个n,m,表示 n个集合,里面的元素为1~n,下面有m种操作,第一个数为 1 时,输入a,b 表示a,b 两个集合合并到一起,第一个数为 2 时,输入a,b表示将 a 从他原来的集 ...

  4. Day13 流程控制

    Linux中的流程控制语句 一.if语句 1.单分支if条件语句 格式:if [ 条件判断式 ] then 程序     fi 注意:1.在Linux中是以if开头,fi结尾.其他地方一般是{开头,} ...

  5. vagrant 入门案例 - 快速创建 Centos7

    中文文档:http://tangbaoping.github.io/vagrant_doc_zh/v2/ 参考: https://blog.csdn.net/yjk13703623757/articl ...

  6. G1垃圾回收器

    垃圾回收器的发展历程 背景 01.G1解决的问题 G1垃圾回收器是04年正式提出,12开始正式支持,在17年作为JDK9默认的垃圾处理器. 在04年的时候,java程序堆的内存越来越大,从而导致程序中 ...

  7. Light of future-凡事预则立

    目录 1.冲刺的时间计划安排 2.针对上一次作业同学.助教提出的问题的回答 3.针对前几次作业的不足的地方进行思考和总结 4.需要改进的团队分工 5.团队的代码规范 6.Github仓库链接 归属班级 ...

  8. 201771010108 -韩腊梅-java学习进度表

    2018面向对象程序设计(Java)课程进度表 周次 (阅读/编写)代码行数  发布博文量/评论他人博文数量  课余学习时间(小时)  学习收获最大的程序阅读或编程任务 1 30/40 1/0 8   ...

  9. 类实例调用静态方法(Java)

    前言 第一次看到在Java中是可以通过类实例调用静态方法,当然不推荐这么做,接下来会讲到,但是在C#中通过类实例调用静态方法在编译时就不会通过,这里做下记录. 类实例调用静态方法 首先我们来看一个简单 ...

  10. 无法加载文件 C:\Users\Administrator\AppData\Roaming\npm\vue.ps1,因为在此系统··········

    网上百度了下,解决方案是: 1. 以管理员身份运行PowerShell2. 执行:get-ExecutionPolicy,回复Restricted,表示状态是禁止的3.执行:set-Execution ...