springboot整合shiro框架学习
springboot整合shiro框架做用户认证与授权
springboot整合shiro框架的流程主要分为:
- 导入shiro依赖
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.7.1</version>
</dependency> - 编写shiro配置类,其中shiroconfig类主要用于配置过滤器,管理器和自定义的认证鉴权类。userRealm类是自定义的认证鉴权类继承自AuthorizingRealm类。
package com.codeyoung.shirodemo.config;/**
* @author: ouououou
* @date: 2021/11/3 14:17
* @description:
*/ import org.apache.shiro.realm.Realm;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import java.util.LinkedHashMap;
import java.util.Map; /**
* @ClassName ShiroConfig
* @Description TODO
* @Author ouououou
* @Date 2021/11/3 14:17
* @Version 1.0
**/
@Configuration
public class ShiroConfig {
//ShiroFilterFactoryBean DefaultWebSecurityManager Realm
@Bean
public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Autowired DefaultWebSecurityManager defaultWebSecurityManager){
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
//设置管理器
shiroFilterFactoryBean.setSecurityManager(defaultWebSecurityManager);
//设置拦截器
Map<String, String> map=new LinkedHashMap<>();
//设置需要拦截的请求和内置的过滤器 anon:无需认证 authc:必须认证了才能通过 user:必须拥有记住我功能 perms:拥有某个资源的权限 role:拥有某个角色权限
map.put("/user/**","authc");
//可以在map中进行权限过滤 添加的过滤器类型为perms 表示拥有user:add权限的用户才可以访问/user/add页面
map.put("/user/add","perms[user:add]");
//设置未授权跳转页面
shiroFilterFactoryBean.setUnauthorizedUrl("/unauthorized");
shiroFilterFactoryBean.setFilterChainDefinitionMap(map);
shiroFilterFactoryBean.setLoginUrl("/toLogin");
return shiroFilterFactoryBean;
} @Bean
public DefaultWebSecurityManager getDefaultWebSecurityManager(@Autowired UserRealm userRealm){
DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();
defaultWebSecurityManager.setRealm(userRealm);
return defaultWebSecurityManager;
} @Bean
public UserRealm getUserRealm(){
return new UserRealm();
}
}package com.codeyoung.shirodemo.config;/**
* @author: ouououou
* @date: 2021/11/3 14:17
* @description:
*/ import com.sun.crypto.provider.PBEWithMD5AndDESCipher;
import org.apache.catalina.User;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.authc.credential.Md5CredentialsMatcher;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.subject.Subject; /**
* @ClassName UserRealm
* @Description TODO
* @Author ouououou
* @Date 2021/11/3 14:17
* @Version 1.0
**/
public class UserRealm extends AuthorizingRealm {
/**
* @description 授权 用户认证后经过授权过滤会进入此方法,可在此方法中进行授权
* @param principalCollection
* @date 2021/11/3 14:25
* @return org.apache.shiro.authz.AuthorizationInfo
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
//获取当前登录的用户为其授权
Subject subject = SecurityUtils.getSubject();
//用户经过认证后将其用户信息放入subject的principal中获取出来
//User principal = (User) subject.getPrincipal();
//通过用户的信息查询数据库中的权限为其授权
simpleAuthorizationInfo.addStringPermission("");
return simpleAuthorizationInfo;
} /**
* @description 认证 控制层调用login方法会进入此方法执行
* @param authenticationToken
* @date 2021/11/3 14:25
* @return org.apache.shiro.authc.AuthenticationInfo
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
//将token转为保存用户名密码的token
UsernamePasswordToken userToken = (UsernamePasswordToken) authenticationToken;
//获取用户名
String username = userToken.getUsername();
//查询数据库获取用户信息
//User user=userService.findUserByName(username);
//通过用户名查询出对应的密码进行认证 模拟查询回来的密码
String password="132";
Md5CredentialsMatcher md5CredentialsMatcher = new Md5CredentialsMatcher(); return new SimpleAuthenticationInfo("", "password", "");
}
} - 当访问任意页面时会进入ShiroConfig类中的过滤器,验证访问该页面需要的认证要求。如果需要登录则会跳转到登录页面。
- 当前端发起登录请求,通过SecurityUtils获取到当前登录的用户,将用户的数据封装到一个UsernamePasswordToken中,执行subject的login方法会进入到自定义认证鉴权类的认证方法doGetAuthenticationInfo(),将方法参数的token转为配置了用户登录参数的token,取出用户名在数据库查询出用户信息后,通过shiro框架的SimpleAuthenticationInfo对象传入密码,shiro框架会对密码进行验证。
@RequestMapping("/login")
public String login(@RequestParam("username") String username,@RequestParam("password") String password,Model model){
//获取当前登录用户
Subject subject = SecurityUtils.getSubject();
//封装用户登录数据
UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken(username,password);
//登录请求会进到认证方法中
try {
subject.login(usernamePasswordToken);
return "index";
}catch (UnknownAccountException e){
model.addAttribute("msg","用户名错误");
return "login";
}catch (IncorrectCredentialsException e){
model.addAttribute("msg","密码错误");
return "login";
}catch (AuthenticationException e) {
e.printStackTrace();
return "login";
}
} - 登陆成功后访问页面,如果页面需要授权则会经过shiroConfig的过滤器跳转到授权的页面,并对用户进行授权。UserRealm类的doGetAuthorizationInfo方法可以对用户进行授权,通过SecurityUtils获取出当前登录的用户,查询数据库获得当前登录的用户的权限列表,再通过simpleAuthorizationInfo对象将用户的权限设置后返回。
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
//获取当前登录的用户为其授权
Subject subject = SecurityUtils.getSubject();
//用户经过认证后将其用户信息放入subject的principal中获取出来
//User principal = (User) subject.getPrincipal();
//通过用户的信息查询数据库中的权限为其授权
simpleAuthorizationInfo.addStringPermission("");
simpleAuthorizationInfo.setObjectPermissions(new HashSet<>());
return simpleAuthorizationInfo;
}
springboot整合shiro框架学习的更多相关文章
- SpringBoot整合Shiro权限框架实战
什么是ACL和RBAC ACL Access Control list:访问控制列表 优点:简单易用,开发便捷 缺点:用户和权限直接挂钩,导致在授予时的复杂性,比较分散,不便于管理 例子:常见的文件系 ...
- springboot整合Shiro功能案例
Shiro 核心功能案例讲解 基于SpringBoot 有源码 从实战中学习Shiro的用法.本章使用SpringBoot快速搭建项目.整合SiteMesh框架布局页面.整合Shiro框架实现用身份认 ...
- SpringBoot整合Shiro+MD5+Salt+Redis实现认证和动态权限管理|前后端分离(下)----筑基后期
写在前面 在上一篇文章<SpringBoot整合Shiro+MD5+Salt+Redis实现认证和动态权限管理(上)----筑基中期>当中,我们初步实现了SpringBoot整合Shiro ...
- 补习系列(6)- springboot 整合 shiro 一指禅
目标 了解ApacheShiro是什么,能做什么: 通过QuickStart 代码领会 Shiro的关键概念: 能基于SpringBoot 整合Shiro 实现URL安全访问: 掌握基于注解的方法,以 ...
- 转:30分钟了解Springboot整合Shiro
引自:30分钟了解Springboot整合Shiro 前言:06年7月的某日,不才创作了一篇题为<30分钟学会如何使用Shiro>的文章.不在意之间居然斩获了22万的阅读量,许多人因此加了 ...
- SpringBoot 整合Shiro 一指禅
目标 了解ApacheShiro是什么,能做什么: 通过QuickStart 代码领会 Shiro的关键概念: 能基于SpringBoot 整合Shiro 实现URL安全访问: 掌握基于注解的方法,以 ...
- SpringBoot整合Shiro+MD5+Salt+Redis实现认证和动态权限管理(上)----筑基中期
写在前面 通过前几篇文章的学习,我们从大体上了解了shiro关于认证和授权方面的应用.在接下来的文章当中,我将通过一个demo,带领大家搭建一个SpringBoot整合Shiro的一个项目开发脚手架, ...
- (十二)整合 Shiro 框架,实现用户权限管理
整合 Shiro 框架,实现用户权限管理 1.Shiro简介 1.1 基础概念 1.2 核心角色 1.3 核心理念 2.SpringBoot整合Shiro 2.1 核心依赖 2.2 Shiro核心配置 ...
- SpringBoot 整合 Shiro 密码登录与邮件验证码登录(多 Realm 认证)
导入依赖(pom.xml) <!--整合Shiro安全框架--> <dependency> <groupId>org.apache.shiro</group ...
- SpringBoot整合Shiro实现权限控制
目录 1.SpringBoot整合Shiro 1.1.shiro简介 1.2.代码的具体实现 1.2.1.Maven的配置 1.2.2.整合需要实现的类 1.2.3.项目结构 1.2.4.ShiroC ...
随机推荐
- Day12_Java_作业
1:需求:请设计一个方法,可以实现获取任意范围内的随机数. package student; import java.util.Random; import java.util.Scanner; /* ...
- 【原创】Ftrace使用及实现机制
Ftrace使用及实现机制 版权声明:本文为本文为博主原创文章,转载请注明出处 https://www.cnblogs.com/wsg1100 如有错误,欢迎指正. 目录 Ftrace使用及实现机制 ...
- linux内核编译体验篇(一)
文章目录 一. 准备环境 二. 获取内核源码 三. 交叉编译工具链的配置 1. 博友们常用安装方法链接 2. 公司常用的交叉工具链使用方法 四. 内核解压以及如何打补丁 五. 内核基本配置 1. 编译 ...
- python3 使用位图排序
代码 from bitmap import BitMap a=[1,5,3,4,7,8,15,6,9] print(a) bm=BitMap(max(a)) #print(dir(bm)) print ...
- [prometheus]配置alertmanager和钉钉告警
目录 prometheus发起告警的逻辑 节点 配置alertmanager 配置钉钉告警插件 配置supervisor守护进程 关联prometheus和alertmanager prometheu ...
- 文心一言 VS 讯飞星火 VS chatgpt (73)-- 算法导论7.1 4题
四.如何修改 QUICKSORT,使得它能够以非递增序进行排序? 文心一言: 快速排序(Quicksort)是一种常用的排序算法,基于分治策略进行设计.默认情况下,快速排序会以递增序进行排序.若想修改 ...
- Amiya 前端UI
最近在使用一个基于Ant Design 二次封装的组件 Git文档地址 Index - Amiya (gitee.io)
- SpringBoot3集成RocketMq
标签:RocketMq5.Dashboard: 一.简介 RocketMQ因其架构简单.业务功能丰富.具备极强可扩展性等特点被广泛应用,比如金融业务.互联网.大数据.物联网等领域的业务场景: 二.环境 ...
- 【Azure App Service】为部署在App Service上的PHP应用开启JIT编译器
问题描述 在App Service for linux上创建一个PHP应用,通过 phpinfo() 查看PHP的扩展设置,发现JIT没有被开启, jit_buffer_size 大小为0. 那么,在 ...
- docker 搭建php环境(踩坑经验!!)
本次安装的推荐配置: nginx 1.24.0 mysql 5.7.43 php 7.4.3-fpm redis 7.2.0 一.安装虚拟机 vm虚拟机需要4g内存,网络使用nat模式设置静态ip ...