SpringBoot 整合 Shiro 密码登录的实现代码
作者:风青宇 发布时间:2023-11-10 11:27:59
标签:SpringBoot,整合,Shiro,密码登录
导入依赖(pom.xml)
<!--整合Shiro安全框架-->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.4.0</version>
</dependency>
<!--集成jwt实现token认证-->
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.2.0</version>
</dependency>
创建 ShiroConfig 配置类
@Configuration
public class ShiroConfig {
/**
* ShiroFilterFactoryBean
*/
@Bean
public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager defaultWebSecurityManager) {
ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
//设置安全管理器
factoryBean.setSecurityManager(defaultWebSecurityManager);
// 添加shiro的内置过滤器
/*
* anon:无需认证就可以访问
* authc:必须认证才能访问
* user:必须拥有 记住我 功能才能用
* perms:拥有对某个资源的权限能访问
* role:拥有某个角色权限能访问
*/
Map<String, String> filterMap = new LinkedHashMap<>();
// 放行不需要权限认证的接口
//放行登录接口
filterMap.put("/login/**", "anon");
//放行用户接口
filterMap.put("/", "anon"); // 网站首页
//认证管理员接口
filterMap.put("/administrators/**", "authc");
factoryBean.setFilterChainDefinitionMap(filterMap);
// 设置无权限时跳转的 url
// 设置登录的请求
factoryBean.setLoginUrl("/login/toLogin");
return factoryBean;
}
/**
* 注入 DefaultWebSecurityManager
*/
@Bean(name = "securityManager")
public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("customRealm") CustomRealm customRealm) {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
//关联CustomRealm
securityManager.setRealm(customRealm);
return securityManager;
}
/**
* 注入 securityManager
*/
@Bean
public CustomRealm customRealm() {
return new CustomRealm();
}
}
创建密码登录时验证授权 CustomRealm 类
@Component
public class CustomRealm extends AuthorizingRealm {
@Autowired
AdministratorsService administratorsService;
/*
* 设置加密方式
*/
{
HashedCredentialsMatcher mather = new HashedCredentialsMatcher();
// 加密方式
mather.setHashAlgorithmName("md5");
// 密码进行一次运算
mather.setHashIterations(512);
this.setCredentialsMatcher(mather);
}
/**
* 授权
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
System.out.println("————授权————doGetAuthorizationInfo————");
return null;
}
/**
* 认证
*/
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
System.out.println("————认证————doGetAuthenticationInfo————");
UsernamePasswordToken userToken = (UsernamePasswordToken) token;
// 连接数据库 查询用户数据
QueryWrapper<Administrators> wrapper = new QueryWrapper<>();
wrapper.eq("username", userToken.getUsername());
Administrators administrators = administratorsService.getOne(wrapper);
if (administrators == null) {
return null; // 抛出异常 UnknownAccountException
}
// 密码认证,shiro做
return new SimpleAuthenticationInfo("", administrators.getPassword(), "");
}
}
控制层用户密码登录
//用户名登录
@ApiOperation(value = "管理员登录", notes = "用户名登录--不进行拦截")
@PostMapping("/doLogin")
public String doLogin(@RequestParam("username") String username,
@RequestParam("password") String password,
HttpSession session,Model model) {
// 获取当前的用户
Subject subject = SecurityUtils.getSubject();
// 封装用户的登录数据
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
try {
subject.login(token);
//保存session会话 管理员名字
session.setAttribute("adname", username);
return "admin";
} catch (UnknownAccountException e) {
model.addAttribute("usererror", "用户名错误!请重新输入。");
return "login";
} catch (IncorrectCredentialsException ice) {
model.addAttribute("pwerror", "密码错误!请重新输入。");
return "login";
}
}
来源:https://www.cnblogs.com/dmflysky/p/14451029.html
0
投稿
猜你喜欢
- 最近要给一个 Winform 项目添加功能,需要一个能显示进度条的弹窗,还要求能够中止任务,所以就做了一个,在此做个记录总结。虽然用的是比较
- 树的结构说得差不多了,现在我们来说说一种数据结构叫做哈希表(hash table),哈希表有是干什么用的呢?我们知道树的操作的时间复杂度通常
- 我的电脑环境win10vscode 1.36.1vscode安装插件安装完这个插件后会提示你安装 platformIOCore,按照提示安装
- Springboot自带定时任务实现动态配置Cron参数同学们,我今天分享一下SpringBoot动态配置Cron参数。场景是这样子的:后台
- 为什么Android要申请权限简单说下在Android6.0及6.0以上一些google认为涉及“危险和用户隐私”的一些权限不仅要做清单文件
- Spring JPA 增加字段执行异常用Spring jpa Entity里面增加了几个字段,但启动报错,提示column Unable t
- 本文实例为大家分享了java实现简单石头剪刀布游戏的具体代码,供大家参考,具体内容如下问题描述Alice, Bob和Cindy一起玩猜拳的游
- 更新了AS 3.1.2之后,发现新建Kotlin类,类注释依然木有,没办法只有自己动手了。方法很简单,编辑File Header就可以啦。只
- 本文实例为大家分享了C++实现企业职工工资管理系统的具体代码,供大家参考,具体内容如下课程设计目的和要求工资管理要和人事管理相联系,生成企业
- FileOutPutStream:子类,写出数据的通道步骤:1.获取目标文件2.创建通道(如果原来没有目标文件,则会自动创建一个)3.写入数
- 定义: SharedPreferences
- package cn.response;import java.awt.Color;import java.awt.Font;import
- 使用限制JDBC未支持列表Sharding-JDBC暂时未支持不常用的JDBC方法。DataSource接口不支持timeout相关操作Co
- 前言最近有项目需要开发档案打包下载功能,其中包含很多大附件,项目使用minio存储且不在同一台服务器上,为了优化速度决定使用windows共
- 一、MyBatis Plus 介绍MyBatis Plus 是国内人员开发的 MyBatis 增强工具,在 MyBatis 的基础上只做增强
- 概述:Flutter 标签类控件大全ChipFlutter内置了多个标签类控件,但本质上它们都是同一个控件,只不过是属性参数不同而已,在学习
- 本文为大家分享了JAVA语言课程设计:连连看小游戏,供大家参考,具体内容如下1.设计内容界面中有5*10的界面,图中共有6种不同的图片,每两
- 前言各位小伙伴大家好,我是A哥。IDEA上个较大版本的发布,要追溯到4月份了:时隔近4个月,北京时间2020-07-28深夜,Intelli
- 对于因为编程错误而导致的异常,或者是不能期望程序捕获的
- 概述从今天开始, 小白我将带大家开启 Jave 数据结构 & 算法的新篇章.循环队列循环队列 (Circular Queue) 是一