shiro 认证问题

@RequestMapping("/login")
public String login(@RequestParam("username") String username,
		@RequestParam("password") String password){
	Subject currentUser = SecurityUtils.getSubject();

	if (!currentUser.isAuthenticated()) {
        // 把用户名和密码封装为 UsernamePasswordToken 对象
        UsernamePasswordToken token = new UsernamePasswordToken(username, password);
        // rememberme
        token.setRememberMe(true);
        try {
            System.out.println("1. " + token.hashCode());
            // 执行登录.
            currentUser.login(token);
        }
        // ... catch more exceptions here (maybe custom ones specific to your application?
        // 所有认证时异常的父类.
        catch (AuthenticationException ae) {
            //unexpected condition?  error?
            System.out.println("登录失败: " + ae.getMessage());
        }
    }

    return "redirect:/list.jsp";
}

如上所示,这是一个 shiro 登录的 spring mvc 接口

protected AuthenticationInfo doGetAuthenticationInfo(
			AuthenticationToken token) throws AuthenticationException {
	System.out.println("[SecondReaml] doGetAuthenticationInfo");

	//1. 把 AuthenticationToken 转换为 UsernamePasswordToken
	UsernamePasswordToken upToken = (UsernamePasswordToken) token;

	//2. 从 UsernamePasswordToken 中来获取 username
	String username = upToken.getUsername();

	//3. 调用数据库的方法, 从数据库中查询 username 对应的用户记录
	System.out.println("从数据库中获取 username: " + username + " 所对应的用户信息.");

	//4. 若用户不存在, 则可以抛出 UnknownAccountException 异常
	if("unknown".equals(username)){
		throw new UnknownAccountException("用户不存在!");
	}

	//5. 根据用户信息的情况, 决定是否需要抛出其他的 AuthenticationException 异常.
	if("monster".equals(username)){
		throw new LockedAccountException("用户被锁定");
	}

	//6. 根据用户的情况, 来构建 AuthenticationInfo 对象并返回. 通常使用的实现类为:
    SimpleAuthenticationInfo
    //以下信息是从数据库中获取的.
	//1). principal: 认证的实体信息. 可以是 username, 也可以是数据表对应的用户的实体类对象.
	Object principal = username;
	//2). credentials: 密码.
	Object credentials = null; //"fc1709d0a95a6be30bc5926fdb7f22f4";
	if("admin".equals(username)){
		credentials = "ce2f6417c7e1d32c1d81a797ee0b499f87c5de06";
	}else if("user".equals(username)){
		credentials = "073d4c3ae812935f23cb3f2a71943f49e082a718";
	}

	//3). realmName: 当前 realm 对象的 name. 调用父类的 getName() 方法即可
	String realmName = getName();
	//4). 盐值.
	ByteSource credentialsSalt = ByteSource.Util.bytes(username);

	SimpleAuthenticationInfo info = null; //new SimpleAuthenticationInfo(principal, credentials, realmName);
	info = new SimpleAuthenticationInfo("secondRealmName", credentials, credentialsSalt, realmName);
	return info;
}

这个是自定义认证方法,在spring 配置文件中配置的。

我始终有一个疑惑,SimpleAuthenticationInfo  到底是怎么能够认证的用户是否存在,用户密码是否正确 ?在不使用spring 的时候,会有一个 shiro.ini 配置文件,这个里面有用户名密码等信息,但是在使用了 spring 这个配置文件就不需要了,然后我们自定义认证类,在自定义认证类中认证,到底是哪一步跟数据库的用户关联的?SimpleAuthenticationInfo 做认证的信息是在哪里 ?

String username = upToken.getUsername();

这个获取的是用户登录的时候输入的用户名密码 ? 还是说我们所判断的用户不存在、密码错误、用户锁定 ,这些信息都是自己使用

throw new LockedAccountException("用户被锁定");

这种方式配判断的 ?自己手动判断 ?然后抛出异常 ?

我感觉我上述的所有的疑惑好像都是不清楚 SimpleAuthenticationInfo 来的运作。还是 AuthenticatingRealm 类的运作我不清楚 ?

原文地址:https://www.cnblogs.com/xylic1128/p/9697232.html

时间: 2024-10-11 01:26:32

shiro 认证问题的相关文章

Apache Shiro 使用手册(二)Shiro 认证

认证就是验证用户身份的过程.在认证过程中,用户需要提交实体信息(Principals)和凭据信息(Credentials)以检验用户是否合法.最常见的"实体/凭证"组合便是"用户名/密码"组合. 一.Shiro认证过程 1.收集实体/凭据信息 Java代码   //Example using most common scenario of username/password pair: UsernamePasswordToken token = new Userna

JAVAWEB开发之权限管理(二)——shiro入门详解以及使用方法、shiro认证与shiro授权

shiro介绍 什么是shiro shiro是Apache的一个开源框架,它将软件系统的安全认证相关的功能抽取出来,实现用户身份认证,权限授权.加密.会话管理等功能,组成了一个通用的安全认证框架.它可以实现如下的功能: 1.验证用户 2.对用户执行访问控制,如:判断用户是否具有角色admin,判断用户是否拥有访问的资源权限. 3.在任何环境下使用SessionAPI.例如C/S程序 4.可以使用多个用户数据源.例如一个是Oracle数据库,另外一个是MySQL数据库. 5.单点登录(SSO)功能

权限项目总结(三) shiro 认证

认证是shiro在使用过程中最开始的一个步骤,只有通过了认证才回有下面授权等操作.认证就是shiro获取当前 用户凭据并进行匹配的过程,最朴素的理解就是弄清楚当前用户的到底是谁的过程.这里也是针对在应用层面的总结,因为发现跟到shiro内部东西就很多了,容易迷失自己. 其实shiro认证过程简化的步骤非常简单 1.提交凭据 2.获取验证信息 3.验证凭据和验证信息是否一致 看一下详细的步骤 粗略的跟了一下shiro认证的流程,处理流程如下. 流程中省去了提交表单获取凭据的过程,也省去了在自定义r

【shiro】(4)---Shiro认证、授权案例讲解

Shiro认证.授权案例讲解 一.认证  1. 认证流程     2.用户密码已经加密.加盐的用户认证 (1)测试类 // 用户登陆和退出,这里我自定了一个realm(开发肯定需要自定义realm获取数据库密码和权限) @Test public void testCustomRealmMd5() { // 创建securityManager工厂,通过ini配置文件创建securityManager工厂 Factory<SecurityManager> factory = new IniSecu

shiro认证-SSM

shiro认证-SSM pom <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>org.apache.shiro</groupId>

shiro框架学习-2-springboot整合shiro及Shiro认证授权流程

1. 添加依赖 1 <dependency> 2 <groupId>org.springframework.boot</groupId> 3 <artifactId>spring-boot-starter-web</artifactId> 4 </dependency> 5 <dependency> 6 <groupId>mysql</groupId> 7 <artifactId>mys

shiro认证

shiro权限认证: 具体的认证流程是这样的: 一般流程: 通过.ini的文件来初始化工厂,.ini的文件的好处是可以创建多个组,而.properties的文件只能创建一组. 系统默认有shiro.ini的文件,但是一般我们是自定义数据源Realm:来存放数据: 该类如下:这里采用了模拟数据库: package cn.itcast.shiro; import java.util.HashMap; import java.util.Map; import org.apache.shiro.auth

源码分析shiro认证授权流程

1. shiro介绍 Apache Shiro是一个强大易用的Java安全框架,提供了认证.授权.加密和会话管理等功能: 认证 - 用户身份识别,常被称为用户“登录”: 授权 - 访问控制: 密码加密 - 保护或隐藏数据防止被偷窥: 会话管理 - 每用户相关的时间敏感的状态. 对于任何一个应用程序,Shiro都可以提供全面的安全管理服务.并且相对于其他安全框架,Shiro要简单的多. 2. shiro源码概况 先要了解shiro的基本框架(见http://www.cnblogs.com/davi

Shiro认证时的密码比对

在前面一节<Shiro在Web环境下集成Spring的大致工作流程>的最后一步中提到由Shiro完整密码比对. 那么具体是怎么工作的? 1,既然shiro会把密码来进行比对,当然会调用 UserNamePasswordkToken 中的 getPassword() 方法了.在该方法中打上断点,往前跟踪一下即可. 2,开启debug模式,跟踪发现 org.apache.shiro.authc.credential.SimpleCredentialsMatcher 类进行密码的比对 3,继续跟踪,

Apache Shiro 认证、授权、加密和会话管理

官方解释 : Apache Shiro(日语"堡垒(Castle)"的意思)是一个强大易用的Java安全框架,提供了认证.授权.加密和会话管理功能,可为任何应用提供安全保障 - 从命令行应用.移动应用到大型网络及企业应用. Shiro为解决下列问题(我喜欢称它们为应用安全的四要素)提供了保护应用的API: 认证 - 用户身份识别,常被称为用户"登录": 授权 - 访问控制: 密码加密 - 保护或隐藏数据防止被偷窥: 会话管理 - 每用户相关的时间敏感的状态. Shi