工作流程:

浏览器将用户名、密码、是否记住登录等信息发送给登录controller ,

new UsernamePasswordToken()获取token,将用户名、加密后的密码、rememberMe,set到token中。SecurityUtils.getSubject();获取subject对象,执行subect.login(token)进行登录操作并捕获可能出现的账号密码错误等异常。

1.前端登录页面将用户名、密码、是否记住登录,传入到Controller
Controller登录方法:
 1 //1.获取shiro中的subject对象
2 Subject subject = SecurityUtils.getSubject();
3 //2.对用户从页面输入的密码进行加密处理
4 password = new Md5Hash(password,username,1024).toString();
5 System.out.println("加密后的密码: " + password);
6 //3.创建shiro中的用户名和密码对象,将用户输入的用户名密码交给shiro管理
7 UsernamePasswordToken token = new UsernamePasswordToken(username, password);
8 //4.关于记住我的设置
9 System.out.println("是否记住我: " + rememberMe);
10 if(rememberMe){
11 token.setRememberMe(true);
12 }
13 //5.调用shiro的登录方法,调用后,shiro会自动执行Realm实现类===========
14 try {
15 subject.login(token);
16 System.out.println("开始登陆");
17 } catch (UnknownAccountException e) {
18 return new Result(1, "账号不存在");
19 }catch (IncorrectCredentialsException e){
20 return new Result(1,"密码错误");
21 }catch (AuthenticationException e){
22 System.out.println("其他异常");
23 return new Result(1,"其他异常");
24 }
25 return new Result(0, "登陆成功!");
26
27 /**
28 * 注销方法
29 * @return
30 */
31 public Result logout(){
32 //1.获取subject对象
33 Subject subject = SecurityUtils.getSubject();
34 //2.返回注销方法
35 subject.logout();
36 //3.返回
37 return Result.ok("注销成功");
38 }

获取完数据后,shiro会自动执行Realm的实现类,实现类需要手动实现,如下:

 1 /**
2 * projectName: myproject
3 * @author: xxx
4 * time: 2021/9/6 21:17
5 * description: 自定义realm对象
6 *
7 * 1.从数据库根据用户名,取出数据库中的用户名,密码交给shiro框架
8 * 2.根据用户名,到数据库取出用户对应的角色和权限对象交给shiro框架管理
9 */
10
11 public class MyUserRealm extends AuthorizingRealm {
12
13 @Autowired
14 private UserService userService;
15 @Autowired
16 private MenuService menuService;
17 @Autowired
18 private RoleService roleService;
19
20 /**
21 * 用户输入的用户名和密码输入正确,校验完成后进行赋值操作
22 * 根据用户名到数据库查询这个用户对应的角色和权限,交给shiro管理
23 * 调用时机:在需要访问资源的时候,需要角色和权限的视乎才会调用此方法
24 * @param principalCollection
25 * @return
26 */
27 @Override
28 protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
29
30 System.out.println("已登陆成功,授予登录用户权限,也就是赋予用户对应的角色和能够访问的菜单");
31
32 //1.获取当前登录的用户对象
33 SysUsers sysUSers = (SysUsers) principalCollection.getPrimaryPrincipal();
34
35 //2.获取当前登录用户的 用户id
36 int uid = sysUSers.getId();
37
38 //3.根据用户id,查询数据库中这个用户对应的角色集合和权限集合
39 Set<String> roleList = roleService.findRoleListByUid(uid);
40 Set<String> menuList = menuService.findMenuListbyUid(uid);
41
42 //4.创建shiro中的用户权限对象
43 SimpleAuthorizationInfo auth = new SimpleAuthorizationInfo();
44
45 //5.将查询到的角色集合放入shiro的权限对象
46 auth.setRoles(roleList);
47
48 //6.将查询到的权限集合放入shiro的权限对象
49 auth.setStringPermissions(menuList);
50
51 //7.返回shiro权限对象
52 return auth;
53 }
54
55 /**
56 * 根据用户在页面输入的用户名,查询数据库中的用户名和密码,交给shiro框架
57 * 让shiro框架进行对比用户名,密码是否正确
58 * 调用时机:在controller调用subject.login(token);方法就会执行这个方法,进行用户名 密码校验
59 * @param auth
60 * @return
61 * @throws AuthenticationException
62 */
63 @Override
64 protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken auth) throws AuthenticationException {
65 System.out.println("开始校验用户名和密码................");
66
67 //1.获取用户在浏览器输入的用户名
68 String userName = (String) auth.getPrincipal();
69 //2.根据用户输入的用户名,查询数据库的用户对象
70 String password = new String((char[]) auth.getCredentials());
71 //3.判断用户是否为空,为空则抛出异常
72 SysUsers sysUSer = userService.findUserbyName(userName);
73 if (sysUSer == null) {
74 throw new UnknownAccountException("账号不存在,请先注册,再登录!");
75 }
76 //4.对比数据库的密码和用户输入的密码是否一致
77 if(!password.equals(sysUSer.getPassword())){
78 throw new IncorrectCredentialsException("密码错误");
79 }
80 //5.判断用户状态,1正常,其他为锁定状态
81 if(sysUSer.getStatus() != 1){
82 throw new LockedAccountException("账号被锁定不允许登录");
83 }
84 //6.封装shiro中需要的权限对象,包括用户名 密码 以及当前用户对象交给shiro返回
85 SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(userName, password, this.getName());
86 return info;
87 }
88 }

其他Controller方法需要做权限验证时,可以在上面加注解@RequiresPermissions("sys:product:add")

括号里是权限字符串,用冒号连接

shiro注解用在Service和Controller层,但是如果Service层有事务注解,那么shiro注解要放在Controller层。因为两个代理对象在类型转换时会出现异常。

shiro登录过程的更多相关文章

  1. Shiro 登录认证源码详解

    Shiro 登录认证源码详解 Apache Shiro 是一个强大且灵活的 Java 开源安全框架,拥有登录认证.授权管理.企业级会话管理和加密等功能,相比 Spring Security 来说要更加 ...

  2. spring boot(十四)shiro登录认证与权限管理

    这篇文章我们来学习如何使用Spring Boot集成Apache Shiro.安全应该是互联网公司的一道生命线,几乎任何的公司都会涉及到这方面的需求.在Java领域一般有Spring Security ...

  3. Shiro登录中遇到了问题

    Shiro登录中遇到了问题 记录二次开发中遇到的问题, 如果系统学习Shiro, 推荐跟我学Shrio. 问题 项目是要将验证从本地改为LDAP验证, 但是因为jeecms的验证和授权中, 用户和角色 ...

  4. 简述Shiro验证过程

    如果让我们自己实现用户登录验证我们都需要哪些步骤? 很简单,根据用户提供的账号从数据库中查询该账户的密码以及一些其他信息,然后拿这个密码与用户输入的密码相比较,因为保存在数据库中的密码一般是经过加密的 ...

  5. 【转】SQL Server -- 已成功与服务器建立连接,但是在登录过程中发生错误

    SQL Server -- 已成功与服务器建立连接,但是在登录过程中发生错误 最近在VS2013上连接远程数据库时,突然连接不上,在跑MSTest下跑的时候,QTAgent32 crash.换成IIS ...

  6. 已成功与服务器建立连接,但是在登录过程中发生错误。 (provider: SSL Provider, error: 0 - 接收到的消息异常,或格式不正确。)

    之前做好的asp.net部署后,发现 访问数据库时: 异常:已捕获: "已成功与服务器建立连接,但是在登录过程中发生错误. (provider: SSL Provider, error: 0 ...

  7. SQL Server(解决问题)已成功与服务器建立连接,但是在登录过程中发生错误。(provider: Shared Memory Provider, error:0 - 管道的另一端上无任何进程。

    http://blog.csdn.net/github_35160620/article/details/52676416 如果你在使用新创建的 SQL Server 用户名和密码 对数据库进行连接的 ...

  8. 使用Shiro登录成功后,跳转到之前访问的页面实现

    转:http://blog.csdn.net/lhacker/article/details/20450855 很多时候,我们需要做到,当用户登录成功后,跳转回登录前的页面.如果用户是点击" ...

  9. flask的session解读及flask_login登录过程研究

    #!/usr/bin/env python # -*- coding: utf-8 -*- from itsdangerous import URLSafeTimedSerializer from f ...

随机推荐

  1. MVC - MVC的工作流程

    MVC 是Model-View-Controller的简写."Model" 代表的是应用的业务逻辑(通过JavaBean,EJB组件实现), "View" 是应 ...

  2. 测试平台系列(97) 完善执行case部分

    大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的教程,希望大家多多支持. 欢迎关注我的公众号米洛的测开日记,获取最新文章教程! 回顾 上一节我们讨论了怎么结束一个 ...

  3. Django——表单

    一.前言 看了下教程,以为表单很简单呢,结果搞了一两个钟才弄懂,哈哈哈,所以说不要小瞧每一件事. 先说明下HTTP请求: HTTP协议以"请求-回复"的方式工作.客户发送请求时,可 ...

  4. 推荐一款M1芯片电脑快速搭建集群的虚拟机软件

    虚拟机软件太多了,出名的莫过于VMware,VirutlaBox以及Parallels Desktop. 我们使用虚拟机软件一般有两种用途: 安装不同于宿主机系统的拥有用户界面的操作系统,比如Wind ...

  5. 分享自己平时使用的socket多客户端通信的代码技术点和软件使用

    前言 说到linux下多进程通信,有好几种,之前也在喵哥的公众号回复过,这里再拿出来,重新写一遍:多进程通信有管道,而管道分为匿名和命名管道 ,后者比前者优势在于可以进行无亲缘进程通信:此外信号也是进 ...

  6. cve-2021-42287和cve-2021-42278漏洞复现

    一.漏洞概述 cve-2021-42287 : 由于Active Directory没有对域中计算机与服务器账号进行验证,经过身份验证的攻击 者利用该漏洞绕过完全限制,可将域中普通用户权限提升为域管理 ...

  7. RPA 抖音机器人汇总

    一.RPA 抖音小店催好评机器人 RPA机器人详情: 1.配置好抖音小店订单号与催好评话术 2.启动抖音小店催好评机器人 3.机器人打开飞鸽客服软件 4.自动搜索订单号,自动发送催好评内容 5.机器人 ...

  8. while and do while

    package study5ran2yl.study; public class deno14 { public static void main(String[] args) { //计算1+2+. ...

  9. 千位分隔符在web开发中的作用

    有千位分隔符会被认为是数字,否则在移动端会被直接识别成手机号 在开发实战中主流实现方式是添加meta标签 <meta name="format-detection" cont ...

  10. 如何优化API?8个实用技巧!【eolink翻译】

    使用 API 可以让公司利用现代连接的力量来帮助他们扩大全球影响力.传输数据和改进集成.由于 API 使企业能够简化流程并增强可用性,所以企业会使用一些优化策略,不断优化流程,比如接下来要说到的8个技 ...