如果让我们自己实现用户登录验证我们都需要哪些步骤?

很简单,根据用户提供的账号从数据库中查询该账户的密码以及一些其他信息,然后拿这个密码与用户输入的密码相比较,因为保存在数据库中的密码一般是经过加密的,所以必须使用同样的加密方式先加密用户输入的密码,拿着加密后的字符串跟数据库中的密码比较,如果相同则登录成功。登录成功后查询账户的角色,根据角色赋予账户操作权限。

Shiro的登录验证思路跟上面一样。只不过shiro为了更通用更灵活,把上面提到的过程与信息做了很多封装,并暴露了一些简单的API供大家使用。

比如,用户输入的账户与密码封装为UsernamePasswordToken对象,登录过程封装为subject.login(token)方法。

正如上面提到的,登录时有个根据账户从数据库获取密码的过程,而这个过程在不同的系统中有不同的实现方式,有的系统通过查询数据库,有的系统可能是通过查询文件,什么样的都有,所以这个地方shiro用抽象类(AuthorizingRealm)的方式预留出来让大家去各自实现,当然,shiro也提供了几个常用的实现,如JdbcRealm.

在AuthorizingRealm类的doGetAuthenticationInfo(…)方法中用户可以根据账户查账户信息,并且把查询到的信息封装成为SimpleAuthenticationInfo对象返回。

现在我们已经有了两个对象:使用用户输入信息封装的UsernamePasswordToken与从数据库查询到的SimpleAuthenticationInfo,下一步就要比较两个对象中的密码是否相同了。

UsernamePasswordToken中的密码是明文,SimpleAuthenticationInfo中的密码是加密后的,如何比较?这个时候AuthorizingRealm 类中的credentialsMatcher对象就派上用场了,让我们看看源码中关于credentialsMatcher的说明:

credentialsMatcher的doCredentialsMatch(AuthenticationToken token, AuthenticationInfo info) 方法专门用来比较用户提供的凭证(也就是密码)与已保存的凭证是否匹配,但在比较之前credentialsMatcher必须先把用户提供的密码进行加密,那用哪种加密办法呢?肯定要跟保存密码时使用的加密方式一致啊,假设我们保存密码时用的是SHA-1,那要怎么告诉credentialsMatcher要用SHA-1加密呢?credentialsMatcher三四个实现类可供选择,这里我们可选择HashedCredentialsMatcher这个实现类并通过setHashAlgorithmName()方法指定加密方式如 md5 、SHA-1...

登录成功后就应该给账户授予角色与权限了,重写AuthorizingRealm类的doGetAuthorizationInfo方法即可:构造一个AuthorizationInfo具体实现(如SimpleAuthorizationInfo)的实例,并调用下面两方法为此实例设置角色与permission,最后返回此实例即可。
simpleAuthorInfo.addRoles(roleList);
simpleAuthorInfo.addStringPermissions(permissionList);

简述Shiro验证过程的更多相关文章

  1. Apache Shiro 认证过程

    3.1.1    示例 Shiro验证Subjects 的过程中,可以分解成三个不同的步骤: 1. 收集Subjects 提交的Principals(身份)和Credentials(凭证): 2. 提 ...

  2. [转]在 .NET 中远程请求 https 内容时,发生错误:根据验证过程,远程证书无效

    该文原网址:http://www.cnblogs.com/xwgli/p/5487930.html 在 .NET 中远程请求 https 内容时,发生错误:根据验证过程,远程证书无效.   当访问 h ...

  3. C#发送邮件异常:根据验证过程,远程证书无效

    今天在做发送邮件功能时,开始用qq邮箱和163邮箱都可以正常发送,后再改用我公司的邮箱和smtp时竟然报错了. 异常提示-----"根据验证过程,远程证书无效",后来通过查询资料解 ...

  4. 架构验证过程发现非数据类型错误 validation found non-data type errors

    问题: infopath报一下错误 validation found non-data type errors 架构验证过程发现非数据类型错误 原因: 重复表字段在后台代码里要一一对应,否则报错. 错 ...

  5. Kerberos验证过程

    参考文献: How the Kerberos Version 5 Authentication Protocol Works: Logon and Authentication SQL Kerbero ...

  6. Spring Security 入门(3-11)Spring Security 的登录密码验证过程 UsernamePasswordAuthenticationFilter

    认证过程如下 一.先判断请求(请求必须是post请求)地址是否为配置的 login-processing-url 值(默认/j_spring_security_check),如果不是,则放行,进入下一 ...

  7. XmlDocument.Load(url) url是https远程时,报错" 基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系。" "根据验证过程,远程证书无效。"

    XmlDocument.Load(url)  url是https远程时,报错" 基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系."   "根据验证过程, ...

  8. C#发送邮件异常:根据验证过程,远程证书无效,何解???

    /// <summary> /// 发送邮件 /// </summary> /// <param name="mailSubjct">邮件主题& ...

  9. System.Security.Authentication.AuthenticationException:根据验证过程,远程证书无效。

    好久没写博客了,今天突然遇到个神奇的问题. 做好的网站在win10上和Windows sever 2012 上都没有问题,搬到Windows sever 2003上就出现了这么一个错误: Server ...

随机推荐

  1. P1540 机器翻译

    题目背景 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章. 题目描述 这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换.对于每个英文单词,软件会先 ...

  2. Hive 常用命令和语句

    示例数据库为 db_hive 1. 创建表 create-table.sql create table if not exists db_hive.tb_user ( id int, username ...

  3. GNOME keyring [(null)] 的密码:

    在ubuntu下执行svn checkout命令时,总是报下面的错误: GNOME keyring [(null)] 的密码:svn: 方法 OPTIONS 失败于 “http://xxxxxxxx/ ...

  4. python基本使用时常见错误

    python基本使用时常见错误 字符编码错误 如果要学习计算机编程语言,首先就要搞懂字符编码,否则在以后的学习过程中,将会是一场噩梦.在一开始使用的时候,我就遇到了很多的关于字符编码的问题,做个简单的 ...

  5. Java Web入门经典扫描版

    全书共分4篇19章,其中,第一篇为“起步篇”,主要包括开启JavaWeb之门.不可不知的客户端应用技术.驾驭JavaWeb开发环境.JavaWeb开发必修课之JSP语法等内容:第二篇为“核心篇”,主要 ...

  6. Linux 性能检查常用命令

    ####消耗CPU最多的进程 [root@Yong ~]# ;|head ##拼接进程号 [root@Yong ~]# |awk '{print $1}' |awk BEGIN{RS=EOF}'{gs ...

  7. JDK 动态代理 讨债实例

    现弄一个讨债接口 package cn.itcast.g_dongtaidaili; public interface Taozhai { void taozhai(); } 再弄一个讨债实现类 pa ...

  8. iOS之旅--隐藏(去除)导航栏底部横线

    iOS之旅--隐藏(去除)导航栏底部横线 iOS开发大部分情况下会使用到导航栏,由于我司的app导航栏需要与下面紧挨着的窗口颜色一致,导航栏底部的横线就会影响这个美观,LZ使用了以下方法.觉得不错,分 ...

  9. 基于mybatis设计简单OA系统问题3

    1.  问题:使用mybatis更新数据失败 描述:java.lang.NullPointerException 提交表单 com.duma.entity.User.updateUser - ==&g ...

  10. js字节转换、字节格式化函数

    有时候在上传附件后需要显示大小,可以选择在后台处理,也可以在前台用js处理. 比如我们想1024MB转换成1GB,那就需要进行转换,这里只是介绍用js进行转换. function bytesToSiz ...