说说shiro的登陆校验吧,shiro的功能就是校验用户的身份和授权用户能访问哪些功能。如果不用shiro我们是如何去实现这个功能呢,一般我们都是在页面让用户输入用户密码,后台控制层接收前台传过来的用户密码,然后根据用户名去库里把对应的密码查出来与用户输的密码进行比较,如果一致,就认为校验通过了。
只要我们知道上面的原理就行了,shiro也是一样的,我们在jsp页面输入用户密码提交到后台控制层,看看下面的代码
@RequestMapping(value = "login", method = RequestMethod.POST, produces = "text/html; charset=utf-8")
public String login(String username, String password, HttpServletRequest request) {
try {
Subject user = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
try {
user.login(token);
} catch (LockedAccountException lae) {
token.clear();
request.setAttribute("error", "用户已经被锁定不能登录,请与管理员联系!");
return "/login";
} catch (ExcessiveAttemptsException e) {
token.clear();
request.setAttribute("error", "账号:" + username + " 登录失败次数过多,锁定10分钟!");
return "/login";
} catch (AuthenticationException e) {
token.clear();
request.setAttribute("error", "用户或密码不正确!");
return "/login";
}
request.removeAttribute("error");
} catch (Exception e) {
e.printStackTrace();
request.setAttribute("error", "登录异常,请联系管理员!");
return "/login";
}
return "redirect:index.shtml";
}
这里最主要的是user.login(token);这里有一个参数token,这个token就是用户输入的用户密码,我们平时可能会用一个对象user来封装用户名和密码,shiro用的是token,这个是控制层的代码,还没到shiro,当调用user.login(token)后,就交给shiro去处理了,接下shiro应该是去token中取出用户名,然后根据用户去查数据库,把数据库中的密码查出来。这部分代码一般都是要求我们自定义实现,自定义一个realm,重写doGetAuthenticationInfo方法
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
String username = (String) token.getPrincipal();
//查询数据库
UserFormMap userFormMap = new UserFormMap();
userFormMap.put("accountName", "" + username + "");
List<UserFormMap> userFormMaps = userMapper.findByNames(userFormMap);
if (userFormMaps.size() != 0) {
SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(username,userFormMaps.get(0).get("password"),ByteSource.Util.bytes(username + "" + userFormMaps.get(0).get("credentialsSalt")),getName());
return authenticationInfo;
} else {
throw new UnknownAccountException();// 没找到帐号
}
}
这个自定义的realm其实挺简单的,就是查数据库里,然后构造一个Authentication,这个Authentication是什么东东,可以这样理解,前面的token是用户输入的用户密码,这个Authentication就是从库里查出来的用户密码,到时两个一比较就能验证登陆成不成功了。主要代码就是SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(username,userFormMaps.get(0).get("password"),ByteSource.Util.bytes(username + "" + userFormMaps.get(0).get("credentialsSalt")),getName());这个构造一个Authentication,里面参数有点多,解释一下,第一个是用户名,第二个是密码,第三个是盐,第四个是realm。第一二个参数不用说了,第三个盐,是加密用的,我们存用户的密码不可能存明文,一般都会加密,有用md5的,银行等金融行业会用加密机加密。这个盐是md5的一个参数,如果不用这个参数你想,如果你的密码是123456,别人的也是123456,md5加密后都是同一个密文,别人很容易猜你的蜜码,加了这个后,同样是123456的明文,加密后的密文也不一样,加密机也有这东西,叫加密因子。第四个参数就是你自定义的realm。
到现在其实还没进行用户身份验证,只是准备好了数据,接下来就是校验这两个身份了。
我们这里是定义一个继承HashedCredentialsMatcher的RetryLimitHashedCredentialsMatcher,
@Override
public boolean doCredentialsMatch(AuthenticationToken authcToken,
AuthenticationInfo info) {
UsernamePasswordToken token = (UsernamePasswordToken) authcToken;
String username = (String) token.getPrincipal();
boolean matches = super.doCredentialsMatch(token, info);
if (matches) {
// clear retry count
passwordRetryCache.remove(username);
}
return matches;
}
这里关键代码:boolean matches = super.doCredentialsMatch(token, info);就是把token跟Authentication进行比较。其实我们知道token里面是用户输入的用户名密码,那个密码没经过任何处理,还是明文,而authentication是数据库里的,是密文,所以要经过处理才能进行校验,这个处理是shiro内部去处理的,里面的源码其实很简单,他就是判断这个authentication是不是SaltedAuthenticationInfo,如果是,他就是SaltedAuthenticationInfo里把盐取出来,再对token中的密码进行加密。我们看看现在这个是authentication接口的子类图
protected Object hashProvidedCredentials(AuthenticationToken token, AuthenticationInfo info) {
Object salt = null;
if (info instanceof SaltedAuthenticationInfo) {
salt = ((SaltedAuthenticationInfo) info).getCredentialsSalt();
} else {
//retain 1.0 backwards compatibility:
if (isHashSalted()) {
salt = getSalt(token);
}
}
return hashProvidedCredentials(token.getCredentials(), salt, getHashIterations());
}
上面这段是shiro的原码,他是判断如果是SaltedAuthenticationInfo。其实我们很多时间不一定会用shiro的加密方式,如果不用他的密方式,我们就不用调shiro的验证方法了,在RetryLimitHashedCredentialsMatcher这里我们已经拿到token和authentication,我们把密码拿出来自己比较就可以了,token的明文调用自定义的加密就好。
String tokenpwd=String.valueOf(token.getPassword());
String databasepwd= String.valueOf(info.getCredentials());
boolean matches =tokenpwd.equals(databasepwd);
if (matches) {
// clear retry count
passwordRetryCache.remove(username);
}
return matches;
这里没有加密,如果有加密就把tokenpwd加一下密跟databasepwd比较就可以。这样整个用户身份校验就完成了。
- 大小: 18.7 KB
分享到:
相关推荐
"shiro登录拦截校验demo"是一个实际应用Shiro框架进行登录验证和权限拦截的示例项目。 在该demo中,我们可以学习到以下几个核心知识点: 1. **Shiro的基本概念**: - **身份验证(Authentication)**:确认用户...
身份认证是Shiro的核心功能之一,它确保只有经过验证的用户才能访问受保护的资源。Shiro支持多种认证机制,如密码验证、双因素认证等。 - **Remembered和Authenticated**:Shiro支持记住登录状态的功能,即...
Apache Shiro是一个开源的Java安全框架,其核心功能是权限管理,常常被拿来与Spring Security框架进行对比。Shiro的特点在于其简单易用,它提供了认证(Authentication)、授权(Authorization)、会话管理(Session...
Shiro是Apache组织提供的一款强大且易用的Java安全框架,它提供了身份认证、授权、会话管理和加密等功能,非常适合在Spring+Struts+Hibernate(SSH)这样的经典企业级开发框架中实现权限校验。 细粒度权限管理的...
标题"shiro登陆注销权限控制"主要涉及的是Apache Shiro框架在登录、登出以及权限管理方面应用。Shiro是一个强大且易用的Java安全框架,处理认证、授权、会话管理和加密等核心安全问题。在这个项目中,登录和注销功能...
在这个"shirodemo实现web登陆"的项目中,我们将探讨如何利用 Shiro 框架在 Web 应用中实现用户登录功能,以及相关的 JSP 和 HTML 集成。 1. **Shiro 的核心概念**: - **Authentication(认证)**:验证用户身份,...
Apache Shiro 是一个强大且易用的 Java 安全框架,提供身份验证、授权、会话管理和加密服务。在 Java Web 应用中,Shiro 可以帮助开发者轻松地处理用户登录、登出以及权限控制等问题。在本文中,我们将讨论如何利用 ...
Apache Shiro 是一个强大且易用的 Java 安全框架,提供认证、授权、加密和会话管理功能,简化了企业级应用的安全实现。在 Shiro 中,`SecurityManager` 是核心组件,它负责整个安全体系的管理和协调工作。本文将深入...
Apache Shiro是一个强大的Java安全框架,它为应用程序提供了身份验证(Authentication)、授权(Authorization)以及会话管理(Session Management)等功能。在这个项目中,我们将会深入理解如何利用Shiro来实现登录...
Apache Shiro 是一个强大且易用的Java安全框架,提供了认证、授权、加密和会话管理功能,可以非常容易地开发出足够安全的应用。在这个"shiro框架登陆注册.zip"的压缩包中,我们可以期待找到一个关于如何在Java应用中...
在“shiro登陆身份认证和权限管理 密码加密”这个主题中,我们将深入理解 Shiro 如何处理用户登录、验证用户身份以及密码的安全存储。 1. **身份认证**:在 Shiro 中,身份认证是验证用户是否是他们声称的那个人的...
"深入浅出Shiro WebSocket内存马" WebSocket 是一种基于 TCP 的网络协议,实现了浏览器与服务器的全双工通讯,允许服务器主动发起信息个客户端。它是一种持久协议,相比于 HTTP 协议是一种无状态的、无连接的、...
SpringBoot整合Shiro后实现免密登录 1,说明一下步骤,需要在原来基础新增三个文件 2,新增CustomToken,重写UsernamePasswordToken免密登录调用方法和密码登录调用方法都在里面。 3,新增...
4. **登录逻辑**:Shiro会根据 Realm 中的认证和授权逻辑进行校验。如果认证成功,用户会被记住;失败则抛出异常,你可以捕获这个异常并返回相应的错误信息。 5. **权限控制**:在页面上,你可以使用Shiro的标签库...
`Apache_Shiro参考手册中文版`和`深入浅出学Shiro`这两本书籍将引导你逐步了解Shiro的架构设计、核心组件的实现细节以及如何扩展Shiro以满足特定需求。通过阅读`shiro源码分析(pdf+word)`,你可以深入探究Shiro的...
Shiro(Apache Shiro)是一个强大且易于使用的Java安全框架,用于身份验证、授权、加密和会话管理等安全功能。它提供了简单的API和灵活的配置选项,可以方便地集成到现有的Java应用程序中。 Shiro的主要特点包括: ...
Apache Shiro是一个强大且易用的Java安全框架,主要用于处理认证、授权、加密以及会话管理等核心安全性问题。在给定的压缩包"shiro1.3.2"中,包含了Shiro的一个核心组件库"shiro-all-1.3.2.jar"以及两个日志管理库...
例如,你可以通过Shiro进行权限校验,防止未授权的用户访问敏感资源。 7. **配置集成**:在Web应用的配置文件(如Spring MVC的配置)中,需要添加对FreeMarker和Shiro的配置,以启用Shiro标签库。这包括设置...