Shiro+SpringBoot认证
该博客以Web为基础
一、引入依赖
shiro-all包含shiro所有的包、shiro-core是核心包、shiro-web是与web整合、shiro-spring是与spring整合、shiro-ehcache是与EHCache整合、shiro-quartz是与任务调度quartz整合等等。这里我们只需要引入shiro-spring即可。
1 <!-- https://mvnrepository.com/artifact/org.apache.shiro/shiro-spring -->
2 <dependency>
3 <groupId>org.apache.shiro</groupId>
4 <artifactId>shiro-spring</artifactId>
5 <version>1.5.3</version>
6 </dependency>
二、Controller层
@RestController
@RequestMapping("/account")
public class AccountController {
/**
* 登录
* @param username
* @param password
* @return
*/
@PostMapping(path = "/login")
public ResultMsg login(
@RequestParam(value = "aaccount")String username,
@RequestParam(value = "apassword")String pwd,
@RequestParam("check") Integer check ) {
ResultMsg resultMsg = new ResultMsg();
// 获取当前用户
Subject subject = SecurityUtils.getSubject();
/**
* 判断当前用户是否已经认证过
*/
// System.out.println("是否记住我==="+subject.isRemembered());
if (!subject.isAuthenticated()) {
// 封装用户的登录数据
UsernamePasswordToken token = new UsernamePasswordToken(username,pwd);
Boolean rememberMe = check == 1 ? true:false;
System.out.println(rememberMe);
token.setRememberMe(rememberMe); //记住我
try {
subject.login(token); //登录认证
resultMsg.setState(200);
resultMsg.setMsg("登录成功");
return resultMsg;
} catch (UnknownAccountException u) {
System.err.println("用户不存在");
resultMsg.setState(412);
resultMsg.setMsg("用户不存在");
return resultMsg;
} catch (IncorrectCredentialsException i) {
System.err.println("密码错误");
resultMsg.setState(412);
resultMsg.setMsg("密码错误");
return resultMsg;
} catch (LockedAccountException l) {
System.err.println("账户锁定");
resultMsg.setState(412);
resultMsg.setMsg("账户锁定");
return resultMsg;
}
} else {
resultMsg.setState(403);
resultMsg.setMsg("此账户已在其他地方登录,是否强制下线?");
return resultMsg;
}
}
/**
* 退出登录
* @param num
* @return
*/
@GetMapping(path = "/loginout")
public ResultMsg loginOut(Integer num) {
ResultMsg resultMsg = new ResultMsg();
// 获取当前用户
Subject subject = SecurityUtils.getSubject();
subject.logout();//退出当前登录
resultMsg.setState(200);
if (num == 1) {
resultMsg.setMsg("已下线!");
} else {
resultMsg.setMsg("当前用户已退出!");
}
return resultMsg; }
/**
* 未认证返回登录页面
* @return
*/
@GetMapping(path = "/login")
public ModelAndView login() {
ModelAndView mv = new ModelAndView("/user/login");
return mv;
} }
Shiro核心配置
Shiro配置类
ShiroConfig.java
主要创建三大Bean对象
- ShiroFilterFactoryBean(拦截一切请求)3
- DefaultSecurityManager(安全管理器)2
- 自定义Realm 继承 AuthorizingRealm(主要用于认证和授权)1
建议创建顺序逆行
package com.hk.aefz.shiro.config;
@Configuration
public class ShiroConfig { // ShiroFliterFactoryBean 3
@Bean
public ShiroFilterFactoryBean getShiroFilterFactoryBean(
@Qualifier("securityManager") DefaultWebSecurityManager securityManager
) {
ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
// 设置安全管理器
factoryBean.setSecurityManager(securityManager);
// 添加Shiro内置过滤器
/*
anon:无需认证就可以访问
authc:必须认证才可以访问
user:必须拥有记住我功能才可以访问
perms:拥有对某个资源的权限才能访问
role:拥有某个角色权限才可以访问
*/ Map<String, String> filterMap = new LinkedHashMap<>();
// 匿名访问
filterMap.put("/navigation/index","anon");
filterMap.put("/navigation/blogdetails","anon");
filterMap.put("/navigation/login","anon");
filterMap.put("/navigation/register","anon");
// 需要角色
filterMap.put("/navigation/personblog","authc,roles[blogger]");
filterMap.put("/navigation/admin-blog","authc,roles[blogger]");
filterMap.put("/navigation/**","user");
factoryBean.setFilterChainDefinitionMap(filterMap);
// 拦截后返回登录页面
factoryBean.setLoginUrl("/navigation/login");return factoryBean;
} // DefaultWebSecurityManager 2 安全管理器
@Bean(name = "securityManager")
public DefaultWebSecurityManager getDefaultWebSecurityManager(
@Qualifier("userRealm") UserRealm userRealm,
) {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
// 关联UserRealm
securityManager.setRealm(userRealm);
return securityManager;
}
// 创建UserRealm类 需要自定义 1
@Bean
public UserRealm userRealm() {
UserRealm userRealm = new UserRealm(); return userRealm;
}
}
}
自定义Relam类
继承AuthorizingRealm类
/**
* 自定义UserRealm
*/
public class UserRealm extends AuthorizingRealm { // 注入AccountController
@Autowired
private AccountController accountController; @Autowired
private UserInfoService userInfoService; @Autowired
private AccountService accountService; // 授权
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
System.err.println("执行了授权.........");return null;
} // 认证
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
System.err.println("执行了认证...........");
// 获取当前登录账户
UsernamePasswordToken accountToken = (UsernamePasswordToken) token;
String username = accountToken.getUsername(); // 获取当前账号
// 连接数据库进行登录验证
Account account = accountController.selectByName(username);
System.out.println(account);
if (account == null) {
return null; //抛出 UnknownAccountException 异常
}
// 密码认证 shiro做 存在泄密
SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(account, account.getApassword(), account.getAaccount());return info;
} }
测试
使用PostMan进行登录测试
Shiro+SpringBoot认证的更多相关文章
- 【原】无脑操作:IDEA + maven + Shiro + SpringBoot + JPA + Thymeleaf实现基础认证权限
开发环境搭建参见<[原]无脑操作:IDEA + maven + SpringBoot + JPA + Thymeleaf实现CRUD及分页> 需求: ① 除了登录页面,在地址栏直接访问其他 ...
- Shiro集成web环境[Springboot]-认证与授权
Shiro集成web环境[Springboot]--认证与授权 在登录页面提交登陆数据后,发起请求也被ShiroFilter拦截,状态码为302 <form action="${pag ...
- 使用Shiro实现认证和授权(基于SpringBoot)
Apache Shiro是一个功能强大且易于使用的Java安全框架,它为开发人员提供了一种直观,全面的身份验证,授权,加密和会话管理解决方案.下面是在SpringBoot中使用Shiro进行认证和授权 ...
- SpringBoot整合Shiro完成认证
三.SpringBoot整合Shiro思路 首先从客户端发来的所有请求都经过Shiro过滤器,如果用户没有认证的都打回去进行认证,认证成功的,再判断是否具有访问某类资源(公有资源,私有资源)的权限,如 ...
- Shiro+springboot+mybatis+EhCache(md5+salt+散列)认证与授权-03
从上文:Shiro+springboot+mybatis(md5+salt+散列)认证与授权-02 当每次进行刷新时,都会从数据库重新查询数据进行授权操作,这样无疑给数据库造成很大的压力,所以需要引入 ...
- Shiro+springboot+mybatis(md5+salt+散列)认证与授权-02
代码延续地址:Shiro+springboot+mybatis(md5+salt+散列)认证与授权-01 1.创建t_role角色表(比如管理员admin,普通用户user等),创建t_pers权限表 ...
- springboot+mybatis+shiro——登录认证和权限控制
转载:https://z77z.oschina.io/ 一.引入依赖 shiro-all包含shiro所有的包.shiro-core是核心包.shiro-web是与web整合.shiro-spring ...
- 【原】无脑操作:IDEA + maven + Shiro + SpringBoot + JPA + Thymeleaf实现基础授权权限
上一篇<[原]无脑操作:IDEA + maven + Shiro + SpringBoot + JPA + Thymeleaf实现基础认证权限>介绍了实现Shiro的基础认证.本篇谈谈实现 ...
- spring boot(十四)shiro登录认证与权限管理
这篇文章我们来学习如何使用Spring Boot集成Apache Shiro.安全应该是互联网公司的一道生命线,几乎任何的公司都会涉及到这方面的需求.在Java领域一般有Spring Security ...
随机推荐
- MSSQL系列 (一):数据库的相关操作(增删改查)
1.创建数据库 --创建数据库 create database stuDb on primary ( --表示属于primary文件组 name='stuDb', --逻辑名称 fileName='D ...
- echarts 实战 : 恼人的间隔问题
使用 echarts 的时候,可能我们需要这个图表的间隔是固定的.比如 3个 4个 5个. (注意计算间隔数量的时候是不算 x轴 本身的.) 这个问题看似简单,其实有点麻烦. yAxis.splitN ...
- layui 魔改:富文本编辑器添加上传视频功能
甲方又整新需求了:富文本编辑器需要可以传视频. layui本身的富文本编辑器没有传视频的功能,所以,又到了咱们魔改的时候了. 友情提醒,富文本编辑器 layedit 只有layui的V1版有,V2版没 ...
- Sharding-Proxy的基本功能使用
Sharding-Proxy是一个分布式数据库中间件,定位为透明化的数据库代理端.作为开发人员可以完全把它当成数据库,而它具体的分片规则在Sharding-Proxy中配置.它的整体架构图如下: 在架 ...
- 解决用vscode开发arduino时Serial未定义
在工作目录编辑c_cpp_properties.json文件 添加defines字段 { "configurations": [ { "name": " ...
- 宽度优先搜索--------迷宫的最短路径问题(dfs)
宽度优先搜索运用了队列(queue)在unility头文件中 源代码 #include<iostream>#include<cstdio>#include<queue&g ...
- java基础(九)--方法重载
如System.out.println()方法即是方法重载的. 以下举例说明自定义sum()方法的重载 package cnblogs; public class TestBase09MathRelo ...
- tomcat8开启APR模式
1 Apr模式介绍 Tomcat可以使用APR来提供超强的可伸缩性和性能,更好地集成本地服务器技术.APR(Apache Portable Runtime)是一个高可移植库,它是Apache HTTP ...
- 安装nginx1.10和状态模块
环境 操作系统: Centos7.2 内核: 3.10.0-327.el7.x86_64 nginx: nginx-1.10.0.tar.gz 安装: 1.安装依赖包 yum -y install g ...
- hashlib加密算法
# import hashlib # mima = hashlib.md5()#创建hash对象,md5是信息摘要算法,生成128位密文 # print(mima) # # mima.update(' ...