认证就是验证用户身份的过程。在认证过程中,用户需要提交实体信息(Principals)和凭据信息(Credentials)以检验用户是否合法。最常见的“实体/凭证”组合便是“用户名/密码”组合。
一、认证过程
1、收集实体/凭据信息
UsernamePasswordToken token = new UsernamePasswordToken(username, password); token.setRememberMe(true);
UsernamePasswordToken支持最常见的用户名/密码的认证机制。同时,由于它实现了RememberMeAuthenticationToken接口,我们可以通过令牌设置“
记住我”的功能。 但是,“已记住”和“已认证”是有区别的: 已记住的用户仅仅是非匿名用户,你可以通过subject.getPrincipals()获取用户信息。但是它并非是认证通过的用户,当你访问需要认证用户的功能时,你仍然需要重新提交认证信息。 这一区别可以参考淘宝网站,网站会默认记住登录的用户,再次访问网站时,对于非敏感的页面功能,页面上会显示记住的用户信息,但是当你访问网站账户信息时仍然需要再次进行登录认证。
2、提交实体/凭据信息
Subject currentUser = SecurityUtils.getSubject(); currentUser.login(token);
收集了实体/凭据信息之后,我们可以通过SecurityUtils工具类,获取当前的用户,然后通过调用login方法提交认证。
3、认证
如果我们自定义Realm实现,比如我后面的例子中,自定义了ShiroDbRealm类,当执行currentUser.login(token)时,会先执行ShiroDbRealm.doGetAuthorizationInfo()进行认证
/** * 验证当前登录的Subject * @see经测试:本例中该方法的调用时机为 * LoginController.login()方法中执行Subject.login()时 */ protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationTokenauthcToken) throws AuthenticationException { //获取基于用户名和密码的令牌 //实际上这个authcToken是从LoginController里面 currentUser.login(token)传过来的 UsernamePasswordToken token = (UsernamePasswordToken) authcToken; //从数据库中查询用户用信息 Useruser = userService.getByAccount(token.getUsername()); if(user != null) { //此处无需比对,比对的逻辑Shiro会做, //我们只需返回一个和令牌相关的正确的验证信息 returnnew SimpleAuthenticationInfo( user.getAccount(), user.getPassword(),getName()); }else { //没有返回登录用户名对应的SimpleAuthenticationInfo对象时, // 就会在LoginController中抛出UnknownAccountException异常 return null; } }
4、认证处理
try { currentUser.login(token); } catch ( UnknownAccountException uae ) { ... } catch ( IncorrectCredentialsException ice ) { ... } catch ( LockedAccountException lae ) { ... } catch ( ExcessiveAttemptsException eae ) { ... } ... catch your own ... } catch ( AuthenticationException ae) { //unexpected error? }
如果login方法执行完毕且没有抛出任何异常信息,那么便认为用户认证通过。之后在应用程序任意地方调用SecurityUtils.getSubject()都可以获取到当前认证通过的用户实例,使用subject.isAuthenticated()判断用户是否已验证都将返回true. 相反,如果login方法执行过程中抛出异常,那么将认为认证失败。Shiro有着丰富的层次鲜明的异常类来描述认证失败的原因,如代码示例。
二、登出操作
登出操作可以通过调用subject.logout()来删除你的登录信息,如:
currentUser.logout();
//removes all identifying information
//and invalidates their session too.
相关推荐
mvc 基于SpringMVC实现的秒杀系统.zip
分析springmvc源码(2).zip分析springmvc源码(2).zip分析springmvc源码(2).zip分析springmvc源码(2).zip分析springmvc源码(2).zip分析springmvc源码(2).zip分析springmvc源码(2).zip分析springmvc源码(2).zip分析...
分析springmvc源码(5).zip分析springmvc源码(5).zip分析springmvc源码(5).zip分析springmvc源码(5).zip分析springmvc源码(5).zip分析springmvc源码(5).zip分析springmvc源码(5).zip分析springmvc源码(5).zip分析...
基于springMVC的session拦截器.rar
SpringMVC精品资源--开放源码,基于springMVC+springSecurity3.x+Mybaits3
基于springmvc实现文件上传下载 基于AOP的日志功能基于springmvc实现文件上传下载 基于AOP的日志功能基于springmvc实现文件上传下载 基于AOP的日志功能基于springmvc实现文件上传下载 基于AOP的日志功能基于...
基于springmvc+Hibernate实现的在线购物商城.zip基于springmvc+Hibernate实现的在线购物商城.zip基于springmvc+Hibernate实现的在线购物商城.zip基于springmvc+Hibernate实现的在线购物商城.zip基于springmvc+...
项目描述 系统分为前台用户界面和后台系统管理: 1. 前台用户界面 ... 查看房源明细、发布房源、提交合同、新闻公告、留言交流 2. 后台系统管理 ... 用户管理:用户列表、用户...SpringMVC+mybatis+bootstrap+jQuery+JSP
springmvc-json-lib.rar springmvc-json-lib.rar
SpringMVC 拦截器实现分析.docx
SpringMVC原理共3页.pdf.zip
基于SSM在线课程管理系统 主要功能说明: 管理员角色包含以下功能:管理员登录,管理员首页,课程管理,学生管理,教师管理,密码管理等功能。 教师角色包含以下功能:教师登录,课程列表,课程管理,密码管理等功能。 学生...
SpringMVC精品资源--JEEWEB Mybatis版本是一款基于SpringMVC+Spring+Mybat
1、手写springmvc框架及分析springmvc源码.zip1、手写springmvc框架及分析springmvc源码.zip1、手写springmvc框架及分析springmvc源码.zip1、手写springmvc框架及分析springmvc源码.zip1、手写springmvc框架及分析...
SpringMVC精品资源--利用 maven 来构建一个多模块基于 SpringMVC + Spring + My
基于Maven+SpringMVC高校教务管理系统.zip
SpringMVC_4.rar.rar
SpringMVC整合AngularJS简单Demo.zip SpringMVC整合AngularJS简单Demo.zip
SpringMVC精品资源--基于springMVC实现的解决方案系统
基于SpringMVC开发网上书城: 1、 书本商品的粗略展示 以及详细信息(价格、类别、简介)的展示。 2、 购物车内展示及购物车的增加和删除。 3、 购物车的提交订单以及订单的展示 4、 平台用户的管理,如:注册、登录...