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

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

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);

最新文章

  1. window下使用Redis Cluster部署Redis集群
  2. ABP理论学习之通知系统
  3. Web客户端数据存储学习笔记——Cookie
  4. 3.线性表-cursor
  5. React Native 获取网络数据
  6. [DBW]大图轮播,可通过两种方法实现
  7. OleDbType.Decimal在插入DB2后会默认赋值0.00,改为OleDbType.Double则正常
  8. python list删除元素 del remove
  9. lintcode 中等题:Min stack 最小栈
  10. Centos 6.4 安装elasticsearch+kibana
  11. Cortex-M3 FLASH 日志文件系统
  12. YARN框架详解
  13. HDU 1017 A Mathematical Curiosity【水,坑】
  14. Spring Security 入门(1-6-1)Spring Security - 配置文件解析和访问请求处理
  15. python:windows下python2.7安装mysql-python失败【转】
  16. iphone怎么投屏到电脑屏幕上
  17. nodejs+koa2微信app支付,小程序支付
  18. The 2016 ACM-ICPC Asia Beijing Regional Contest E - What a Ridiculous Election
  19. nginx servername配置域名网站可以正常登录,servername配置IP+Port却无法正常登录
  20. sqlite3错误码整理

热门文章

  1. [转] JAVA中读取网络中的图片资源导入到EXCEL中
  2. 4.Spring Cloud初相识--------Feign负载均衡
  3. dicom和dicomdir
  4. lintcode_177_把排序数组转换为高度最小的二叉搜索树
  5. 如何在RedHat 7.0系统中安装mysql 5.7.22
  6. python中enumerate函数使用
  7. dts--framework(二)
  8. 标签种类及CSS引入方法
  9. Android内购订单验证 --- php实现
  10. python中的字典内置方法小结