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. 关于js中iframe 中 location.href的用法

    关于js中"window.location.href"."location.href"."parent.location.href".&qu ...

  2. Ubuntu 18.04 将gcc版本降级为5.5版本

    Remark: Polynomial algebra 程序由于版本问题只能在gcc 5.0 版本运行, 而ubuntu更新会将gcc 更新到7.0版本,出现冲突(报错:如下) collect2: er ...

  3. OpenCV-Python 如何使用背景分离方法 | 四十六

    目标 背景分离(BS)是一种通过使用静态相机来生成前景掩码(即包含属于场景中的移动对象像素的二进制图像)的常用技术. 顾名思义,BS计算前景掩码,在当前帧与背景模型之间执行减法运算,其中包含场景的静态 ...

  4. 大O 表示法

    大O表示法 指出了算法有多快.例如,假设列表包含n个元素.简单查找需要检查每个元素,因此需要执行n次操作.使用大O表示法,这个运行时间为O(n).单位秒呢?没有——大O表示法指的并非以秒为单位的速度. ...

  5. 7.Maven命令

    在eclipse中运行maven 一.首先要对pom.xml文件右键→Run As→Maven build 二.输入Maven命令 三.常见的Maven命令有: [1]clean 清理 [2]comp ...

  6. 一文搞懂 ThreadLocal 原理

    当多线程访问共享可变数据时,涉及到线程间同步的问题,并不是所有时候,都要用到共享数据,所以就需要线程封闭出场了. 数据都被封闭在各自的线程之中,就不需要同步,这种通过将数据封闭在线程中而避免使用同步的 ...

  7. Linux下使用FastDFS

    本文所有操作均在CentOS 7.x环境下进行. 1.1.单节点FastDFS 整个安装过程非常复杂,很容易出错,建议进行多次备份. 我们这里不打算安装多台虚拟机,因此会把tracker和storag ...

  8. 3.Metasploit攻击流程及命令介绍

    Metasploit 进阶第一讲    攻击流程及命令介绍   01.渗透测试过程环节(PTES)   1.前期交互阶段:与客户组织进行交互讨论,确定范围,目标等 2.情报搜集阶段:获取更多目标组织信 ...

  9. A 【NOIP2012 day2】疫情控制

    时间限制 : 20000 MS   空间限制 : 128000 KB 评测说明 : 2s,128m 问题描述 H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是 ...

  10. Spring之Bean的管理方式(Content,Beans)

    Spring的bean管理(注释) 注解 代码里特殊的标记,使用注解也可以直接完成相关功能 注解写法:@注解名称(属性名=属性值) 使用在类,方法,属性上面 Spring注解开发准备 导入jar包 ( ...