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

下面即springboot集成shiro,实现用户登录认证功能

1.原理

shiro外部架构如下:

主要包括三大实体:Subject、Realm、和SecurityManager。

Subject即当前用户,我们可以通过Subject自带的 SecurityUtils.getSubject()方法获取当前对象,并通过当前用户拿到shiro的session,进行后续的认证授权等。

SecurityManager即安全管理器,可以视为拦截器,拦截请求,并转至shiro中处理。

Realm,可以有1个或多个Realm,即安全实体数据源,即用于获取安全实体的;可以是JDBC实现,也可以是LDAP实现,或者内存实现等等;一般由用户自定义实现。

shiro实现过程一般如下,编写shiro配置文件,配置对应的加密方式,并注册进Realm中,然后把对应的realm注入shiro配置中进行注册;编写Realm类,实现对应的登录认证、授权等功能。

2.注入依赖

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

3.编写shiro配置文件

@Configuration
public class ShiroConfig {//此处用于实现授权功能,配置需要拦截的接口@Beanpublic ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("getDefaultWebSecurityManager") DefaultWebSecurityManager defaultWebSecurityManager) {ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();shiroFilterFactoryBean.setSecurityManager(defaultWebSecurityManager);//拦截页面Map<String, String> filterMap = new LinkedHashMap<>();//登录/登出,所有人的权限filterMap.put("/user/login", "anon");filterMap.put("/user/logout", "anon");shiroFilterFactoryBean.setFilterChainDefinitionMap(filterMap);//未登录页面跳转shiroFilterFactoryBean.setLoginUrl("/user/show");//未有权限页面跳转shiroFilterFactoryBean.setUnauthorizedUrl("/user/unauthorized");return shiroFilterFactoryBean;}//注入对应的userRealm类@Beanpublic DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm) {DefaultWebSecurityManager SecurityManager = new DefaultWebSecurityManager();SecurityManager.setRealm(userRealm);return SecurityManager;}@Beanpublic UserRealm userRealm() {UserRealm userRealm = new UserRealm();//注册MD5加密userRealm.setCredentialsMatcher(hashedCredentialsMatcher());return userRealm;}/*** 设置shiro加密方式** @return HashedCredentialsMatcher*/@Beanpublic HashedCredentialsMatcher hashedCredentialsMatcher(){HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();// 使用md5 算法进行加密hashedCredentialsMatcher.setHashAlgorithmName("md5");// 设置散列次数: 意为加密几次hashedCredentialsMatcher.setHashIterations(2);return hashedCredentialsMatcher;}}

4.编写userRealm类,实现登录拦截

@Slf4j
public class UserRealm extends AuthorizingRealm {@Autowiredprivate UserManageService userManageService;//授权@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {/**配置权限*此处User实体需配置属性roles,用户权限*获取当前用户对象* */SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();Subject subject= SecurityUtils.getSubject();UserAccount currentUser =(UserAccount) subject.getPrincipal();authorizationInfo.addStringPermission(currentUser.getRoles());log.info("用户权限为:"+currentUser.getRoles());return authorizationInfo;}//认证@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;//用户名/密码认证//从接口处获取得到的用户名String username = token.getUsername();//调用mybatis_plus中的方法,查询数据库中用户名对应的数据QueryWrapper<UserAccount> wrapper = new QueryWrapper<>();wrapper.eq("Username",username);UserAccount user=userManageService.getOne(wrapper);//为空,即用户名不存在if(user==null){return null;}else {log.info(user.getUsername());}//principal:认证的实体信息,可以是username,也可以是数据库表对应的用户的实体对象Object principal = user.getUsername();return  new SimpleAuthenticationInfo(user, user.getPassword() , ByteSource.Util.bytes(principal),getName());}
}

注意:此处进行登录验证时使用了MD5加密,即数据库中存储的密码应是MD5加密后的密文密码,而不是明文密码。

示例如下:

//md5加密
admin.setPassword(new Md5Hash(admin.getPassword(), admin.getUsername(),2).toString());

5.编写controller接口

//用户登录(使用用户名)@PostMapping("/login")public CommonResult<Object> UserLogin(@RequestBody UserAccount user){String username=user.getUsername();String password=user.getPassword();//shiro验证Subject subject= SecurityUtils.getSubject();//根据用户名密码生成一个令牌UsernamePasswordToken token=new UsernamePasswordToken(username,password);try {subject.login(token);    //执行登录操作} catch (UnknownAccountException e) {log.info("登录用户不存在");return new CommonResult<>(416,"用户不存在",username);} catch (IncorrectCredentialsException e) {log.info("登录密码错误");return new CommonResult<>(412,"密码错误,请重新登录",password);}catch (AuthenticationException e) {log.warn("用户登录异常:" + e.getMessage());return new CommonResult<>(416,"账户异常",username);}return new CommonResult<>(200,"登录成功",username);}

springboot集成shiro实现用户登录认证相关推荐

  1. SpringBoot 快速集成 JWT 实现用户登录认证

    前言:当今前后端分离时代,基于Token的会话保持机制比传统的Session/Cookie机制更加方便,下面我会介绍SpringBoot快速集成JWT库java-jwt以完成用户登录认证. 一.JWT ...

  2. SpringBoot集成Shiro安全框架

    SpringBoot集成Shiro安全框架 1.shiro的定义 2.SpringBoot集成shiro的步骤 3.完成的效果 1.shiro的定义 1.shiro的作用 认证.授权.加密.会话管理. ...

  3. Apache Shiro实现用户登录功能

    apache shiro实现用户登录功能 配置shiro的Filter实现URL级别权限控制 配置web.xml <!-- shiro的过滤器 --> <filter>< ...

  4. java用户的登录图片_Java 如何用 token 做用户登录认证

    1.什么是 token??? Token 是服务端生成的一串字符串,以作客户端进行请求的一个令牌. 2.token 做用户登录认证 ● 流程 3. Java 实现 ● 用户登录生成 token,保存到 ...

  5. java+登录window域认证网页_Java 如何用 token 做用户登录认证

    1.什么是 token??? Token 是服务端生成的一串字符串,以作客户端进行请求的一个令牌. 2.token 做用户登录认证 ● 流程 3. Java 实现 ● 用户登录生成 token,保存到 ...

  6. 基于jwt的用户登录认证

    最近在app的开发过程中,做了一个基于token的用户登录认证,使用vue+node+mongoDB进行的开发,前来总结一下. token认证流程: 1:用户输入用户名和密码,进行登录操作,发送登录信 ...

  7. java通过ldap添加用户后_ldap连接不上改用户_JAVA通过LDAP做用户登录认证,怎么做业务的异常处理?...

    通过java.namming包实现LDAP用户登录认证,怎么区分账号被冻结.停用.不存在等异常的业务情况呢? 参考的是:网上普遍流传的LDAP连接的代码 public boolean auth(Str ...

  8. Springboot自定义注解实现用户登录状态校验(一)

    Springboot自定义注解实现用户登录状态校验(一) 拦截器方式 定义注解类 import java.lang.annotation.*;/*** @author:小飞猪* @date:2020/ ...

  9. springboot集成shiro 前后端分离 统一处理shiro异常

    springboot集成shiro 前后端分离 统一处理shiro异常 参考文章: (1)springboot集成shiro 前后端分离 统一处理shiro异常 (2)https://www.cnbl ...

最新文章

  1. bitcask存储引擎
  2. XunSearch中常用方法整合
  3. FastDFS测试图片上传
  4. 入门Python,这些优点你要知道
  5. 寻找数组中第K频繁的元素
  6. 从ASP.NET Boilerplate v5 +到ABP框架的迁移
  7. nginx 小简单指令
  8. Pycharm汉化使用教程
  9. 机器人启示录 百度影音_斯皮尔伯格筹备新作 《机器人启示录》有望启动
  10. Flutter 微信语音消息播放动画
  11. 小灵通为什么会退市?
  12. 摄影师用AI预测MJ、李小龙活到现在长什么样,网友看后泪目
  13. 通用Nginx优化配置
  14. VC :在对话框中绘图
  15. 从面试官角度观察到的程序员技能瓶颈,同时给出突破瓶颈的建议
  16. 风华秋实、巨星传奇多次上市未果,再次冲击IPO
  17. 华为HCNA实验操作之常用操作命令11-20
  18. 【044】OEDC数据库-经合组织公开国家数据库
  19. 西门子S7-200 SMART(6ES7 288-1ST40-0AA0)相关与晨控智能CK-FR08-E00关于modbus tcp 通信配置指南
  20. jpg图片转为pdf?图片生成pdf的步骤?图片转pdf格式怎么转简单的教程方法?

热门文章

  1. (最终)如何利用印象笔记搭建自己的知识体系
  2. 利用Lambda表达式解决c#文件名排序问题(是100大还是11大的问题)
  3. Workbench LS-DYNA联合LSPP进行玻璃破碎分析
  4. 小熊派 FreeRTOS+SPI+DMA 驱动 TFT-LCD
  5. 第10章第14节:使用iSlide的图表库往幻灯片中插入精美的图表 [PowerPoint精美幻灯片实战教程]
  6. Java进阶专题(七) 设计模式之委派模式与策略模式
  7. Python异步编程实战入门:从概念到实战
  8. 测试岗人员转型已是必然选择:我的十年自动化测试经验分享
  9. ETL kettle读取Api接口
  10. Markdown 进阶技能:用代码画流程图(编程零基础也适用)