身份验证,即在应用中谁能证明他就是他本人。一般提供如他们的身份ID一些标识信息来表明他就是他本人,如提供身份证,用户名/密码来证明。

在shiro中,用户需要提供principals (身份)和credentials(证明)给shiro,从而应用能验证用户身份:

principals:身份,即主体的标识属性,可以是任何东西,如用户名、邮箱等,唯一即可。一个主体可以有多个principals,但只有一个Primary principals,一般是用户名/密码/手机号。

credentials:证明/凭证,即只有主体知道的安全值,如密码/数字证书等。

最常见的principals和credentials组合就是用户名/密码了。接下来先进行一个基本的身份认证。

先导入maven

配置realm的方法

  1. public class MyRealm1 implements Realm{
  2.  
  3. public String getName() {
  4. // TODO Auto-generated method stub
  5. return "myrealm1";
  6. }
  7.  
  8. public boolean supports(AuthenticationToken token) {
  9. // TODO Auto-generated method stub
  10. return token instanceof UsernamePasswordToken;//判断token是否是UserPasswordToken类型,是的话才能使用。
  11. }
  12.  
  13. public AuthenticationInfo getAuthenticationInfo(AuthenticationToken token)
  14. throws AuthenticationException {
  15. // TODO Auto-generated method stub
  16. String name = (String)token.getPrincipal();
  17. String password = new String((char[])token.getCredentials());;
  18.  
  19. if (!("sheng".equals(name))){
  20. System.out.println("登录名字没有");
  21. throw new UnknownAccountException();
  22. }
  23.  
  24. if (!("zhi".equals(password))){
  25. System.out.println("登录密码错误");
  26. throw new IncorrectCredentialsException();
  27. }
  28. return new SimpleAuthenticationInfo(name, password, getName());
  29. }
  30.  
  31. };

配置 ini文件

  1. #文件名字为shirio-myrealm.ini
  2. myRealm1=shiro.MyRealm1
  3. securityManager.realms=$myRealm1

测试

  1. @Test
  2. public void testHelloworldForMyRealm1() {
  3. //1、获取SecurityManager工厂,此处使用Ini配置文件初始化SecurityManager
  4. Factory<org.apache.shiro.mgt.SecurityManager> factory = new IniSecurityManagerFactory("classpath:shirio-myrealm.ini");
  5. //2、得到SecurityManager实例 并绑定给SecurityUtils
  6. org.apache.shiro.mgt.SecurityManager securityManager = factory.getInstance();
  7. SecurityUtils.setSecurityManager(securityManager);
  8. //3、得到Subject及创建用户名/密码身份验证Token(即用户身份/凭证)
  9. Subject subject = SecurityUtils.getSubject();
  10. UsernamePasswordToken token = new UsernamePasswordToken("sheng", "zhi");
  11. try {
  12. //4、登录,即身份验证
  13. subject.login(token);
  14. System.out.println("success");
  15. } catch (AuthenticationException e) {
  16. //5、身份验证失败
  17. System.out.println("fail");
  18. System.out.println(e.getMessage());
  19.  
  20. }
  21. Assert.assertEquals(true, subject.isAuthenticated()); //断言用户已经登录
  22. //6、退出
  23. subject.logout();
  24. }

通过这个简单测试,我们知道,权限登录,首先要有realm(理解为数据源) token(登录信息) 以及manager管理 而authenticator属于manager里面。

realm 有

配置文件形式realm

  1.  
  1. #文件名shiro.ini
  1. [users]
  2. zhang=123
  3. wang=123

jdbc形式(要注意对用户的验证根据自己需求重写!!!!导入的driver和平时的不一样!!!!)

  1. #文件名shiro-jdbc-realm.ini
  2.  
  3. jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm
  1. dataSource=com.alibaba.druid.pool.DruidDataSource
  2. dataSource.driverClassName=oracle.jdbc.OracleDriver
  3. dataSource.url=jdbc:oracle:thin:@127.0.0.1:1521:ORCL
  4. dataSource.username=userstudy
  5. dataSource.password=s836659812S
  6. jdbcRealm.dataSource=$dataSource
  7. securityManager.realms=$jdbcRealm
  8. jdbcRealm.authenticationQuery = select password from shiro where users = ?
  9. jdbcRealm.userRolesQuery = SELECT user_roles FROM shiro WHERE users = ?
  10. jdbcRealm.permissionsQuery = SELECT roles_permissions FROM shiro WHERE users = ?

以及多个realm的时候

  1. #文件名shiro-authenticator-success.ini
    #指定securityManager的authenticator实现
  2. authenticator=org.apache.shiro.authc.pam.ModularRealmAuthenticator
  3. securityManager.authenticator=$authenticator
  4.  
  5. #指定securityManager.authenticator的authenticationStrategy
  6. allSuccessfulStrategy=org.apache.shiro.authc.pam.AllSuccessfulStrategy #在这里进行选择的策略
  7. securityManager.authenticator.authenticationStrategy=$allSuccessfulStrategy
  8.  
  9. myRealm1=shiro.MyRealm1
  10. myRealm2=shiro.MyRealm2
  11. myRealm3=shiro.MyRealm3
  12. securityManager.realms=$myRealm1,$myRealm2 #realm1和realm2结构相同,数据可能不一样

以及测试类

  1. package shiro;
  2.  
  3. import junit.framework.Assert;
  4.  
  5. import org.apache.shiro.SecurityUtils;
  6. import org.apache.shiro.authc.AuthenticationException;
  7. import org.apache.shiro.authc.UsernamePasswordToken;
  8. import org.apache.shiro.config.IniSecurityManagerFactory;
  9. import org.apache.shiro.realm.jdbc.JdbcRealm;
  10. import org.apache.shiro.subject.PrincipalCollection;
  11. import org.apache.shiro.subject.Subject;
  12. import org.apache.shiro.util.Factory;
  13. import org.junit.Test;
  14.  
  15. public class UserTest {
  16.  
  17. /*
  18. @Test
  19. public void testHelloworld() {
  20. //1、获取SecurityManager工厂,此处使用Ini配置文件初始化SecurityManager
  21. Factory<org.apache.shiro.mgt.SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
  22. //2、得到SecurityManager实例 并绑定给SecurityUtils
  23. org.apache.shiro.mgt.SecurityManager securityManager = factory.getInstance();
  24. SecurityUtils.setSecurityManager(securityManager);
  25. //3、得到Subject及创建用户名/密码身份验证Token(即用户身份/凭证)
  26. Subject subject = SecurityUtils.getSubject();
  27. UsernamePasswordToken token = new UsernamePasswordToken("zhang", "123");
  28. try {
  29. System.out.println(UserTest.class.getResource(""));
  30. //4、登录,即身份验证
  31. subject.login(token);
  32. System.out.println("success");
  33. } catch (AuthenticationException e) {
  34. //5、身份验证失败
  35. System.out.println("login success.");
  36. }
  37. Assert.assertEquals(true, subject.isAuthenticated()); //断言用户已经登录
  38. //6、退出
  39. subject.logout();
  40. }
  41. */
  42.  
  43. /*
  44. @Test
  45. public void testHelloworldForMyRealm1() {
  46. //1、获取SecurityManager工厂,此处使用Ini配置文件初始化SecurityManager
  47. Factory<org.apache.shiro.mgt.SecurityManager> factory = new IniSecurityManagerFactory("classpath:shirio-myrealm.ini");
  48. //2、得到SecurityManager实例 并绑定给SecurityUtils
  49. org.apache.shiro.mgt.SecurityManager securityManager = factory.getInstance();
  50. SecurityUtils.setSecurityManager(securityManager);
  51. //3、得到Subject及创建用户名/密码身份验证Token(即用户身份/凭证)
  52. Subject subject = SecurityUtils.getSubject();
  53. UsernamePasswordToken token = new UsernamePasswordToken("sheng", "zhi");
  54. try {
  55. //4、登录,即身份验证
  56. subject.login(token);
  57. System.out.println("success");
  58. } catch (AuthenticationException e) {
  59. //5、身份验证失败
  60. System.out.println("fail");
  61. System.out.println(e.getMessage());
  62.  
  63. }
  64. Assert.assertEquals(true, subject.isAuthenticated()); //断言用户已经登录
  65. //6、退出
  66. subject.logout();
  67. }
  68. */
  69.  
  70. /*
  71. @Test
  72. public void testJDBCRealm() {
  73. //1、获取SecurityManager工厂,此处使用Ini配置文件初始化SecurityManager
  74. Factory<org.apache.shiro.mgt.SecurityManager> factory =
  75. new IniSecurityManagerFactory("classpath:shiro-jdbc-realm.ini");
  76.  
  77. //2、得到SecurityManager实例 并绑定给SecurityUtils
  78. org.apache.shiro.mgt.SecurityManager securityManager = factory.getInstance();
  79. SecurityUtils.setSecurityManager(securityManager);
  80.  
  81. //3、得到Subject及创建用户名/密码身份验证Token(即用户身份/凭证)
  82. Subject subject = SecurityUtils.getSubject();
  83. UsernamePasswordToken token = new UsernamePasswordToken("zhizhi", "567");
  84.  
  85. try {
  86. //4、登录,即身份验证
  87. subject.login(token);
  88. System.out.println("success");
  89. } catch (AuthenticationException e) {
  90. //5、身份验证失败
  91. System.out.println("fail");
  92. e.printStackTrace();
  93. }
  94.  
  95. Assert.assertEquals(true, subject.isAuthenticated()); //断言用户已经登录
  96.  
  97. //6、退出
  98. subject.logout();
  99. }
  100. */
  101.  
  102. private void login(String filePath){
  103. //1、获取SecurityManager工厂,此处使用Ini配置文件初始化SecurityManager
  104. Factory<org.apache.shiro.mgt.SecurityManager> factory =
  105. new IniSecurityManagerFactory(filePath);
  106.  
  107. //2、得到SecurityManager实例 并绑定给SecurityUtils
  108. org.apache.shiro.mgt.SecurityManager securityManager = factory.getInstance();
  109. SecurityUtils.setSecurityManager(securityManager);
  110.  
  111. //3、得到Subject及创建用户名/密码身份验证Token(即用户身份/凭证)
  112. Subject subject = SecurityUtils.getSubject();
  113. UsernamePasswordToken token = new UsernamePasswordToken("sheng", "zhi");
  114. try {
  115. //4、登录,即身份验证
  116. subject.login(token);
  117. System.out.println("success");
  118. } catch (AuthenticationException e) {
  119. //5、身份验证失败
  120. System.out.println("fail");
  121. System.out.println(e.getMessage());;
  122. }
  123.  
  124. }
  125.  
  126. @Test
  127. public void testAllSuccessfulStrategyWithSuccess() {
  128. login("classpath:shiro-authenticator-success.ini");
  129. Subject subject = SecurityUtils.getSubject();
  130. //得到一个身份集合,其包含了Realm验证成功的身份信息
  131. PrincipalCollection principalCollection = subject.getPrincipals();
  132. Assert.assertEquals(2, principalCollection.asList().size());
  133. }
  134.  
  135. }

最常见的错误

Authentication failed for token submission [org.apache.shiro.authc.UsernamePasswordToken - sheng, rememberMe=false].  Possible unexpected error? (Typical or expected login exceptions should extend from AuthenticationException).

多半是配置文件写错名字了,比如少了$

以及可以自定义策略,自定义实现时一般继承org.apache.shiro.authc.pam.AbstractAuthenticationStrategy即可,具体可以参考代码com.github.zhangkaitao.shiro.chapter2.authenticator.strategy包下OnlyOneAuthenticatorStrategy 和AtLeastTwoAuthenticatorStrategy。

shiro学习(二)身份验证的更多相关文章

  1. Shiro学习之身份验证

    身份验证,即在应用中谁能证明他就是他本人.一般提供如他们的身份ID一些标识信息来表明他就是他本人,如提供身份证,用户名/密码来证明. 在shiro中,用户需要提供principals (身份)和cre ...

  2. 【二】shiro入门 之 身份验证

    大体步骤如下: 1.首先通过new IniSecurityManagerFactory 并指定一个ini 配置文件来创建一个SecurityManager工厂: 2.接着获取SecurityManag ...

  3. Shiro -- (二) 身份验证基本流程

    简介: 在 shiro 中,用户需要提供 principals (身份)和 credentials(证明)给 shiro,从而应用能验证用户身份: principals:身份,即主体的标识属性,可以是 ...

  4. shiro 简单的身份验证 案例

    Apache Shiro是Java的一个安全框架,Shiro可以帮助我们完成:认证.授权.加密.会话管理.与Web集成.缓存等. 简单的身份验证 项目目录: 首先,在shiro.ini里配置了用户名和 ...

  5. ASP.NET MVC5学习系列——身份验证、授权

    一.什么是身份验证和授权 人们有时对用户身份验证和用户授权之间的区别感到疑惑.用户身份验证是指通过某种形式的登录机制(包括用户名/密码.OpenID.OAuth等说明身份的项)来核实用户的身份.授权验 ...

  6. React 学习(二) ---- props验证与默认属性

    在上一节中, 我们提到了props, 组件之间数据的传递使用props. 我们调用组件时可以设置props, 组件内部通过props获取. 为了props 使用更加友好, React 提供了简单的验证 ...

  7. shiro系列二、身份验证和授权

    一.身份验证 先来看看身份验证的流程 流程如下: 1.首先调用Subject.login(token)进行登录,其会自动委托给Security Manager,调用之前必须通过SecurityUtil ...

  8. Shiro学习(2)身份验证

    身份验证,即在应用中谁能证明他就是他本人.一般提供如他们的身份ID一些标识信息来表明他就是他本人,如提供身份证,用户名/密码来证明. 在shiro中,用户需要提供principals (身份)和cre ...

  9. 跟开涛老师学shiro -- 身份验证

    身份验证,即在应用中谁能证明他就是他本人.一般提供如他们的身份ID一些标识信息来表明他就是他本人,如提供身份证,用户名/密码来证明. 在shiro中,用户需要提供principals (身份)和cre ...

  10. 第二章:shiro身份验证

    身份验证,即在应用中谁能证明他就是他本人.一般提供如他们的身份ID一些标识信息来表明他就是他本人,如提供身份证,用户名/密码来证明. 在shiro中,用户需要提供principals (身份)和cre ...

随机推荐

  1. (Go rails)使用Rescue_from(ActiveSupport:Rescuable::ClassMethods)来解决404(ActiveRecord::RecordNotFound)❌

    https://gorails.com/episodes/handle-404-using-rescue_from?autoplay=1 我的git: https://github.com/chent ...

  2. 跨域和jsonp的原理

    什么是跨域? 跨域,指的是浏览器不能执行其他网站的脚本.它是由浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制. 所谓同源是指,域名,协议,端口均相同,不明白没关系,举个栗子: h ...

  3. implode

    $names = implode('|', array_column($categoryBackNameArr, 'name'));

  4. 廖雪峰网站:学习python基础知识—循环(四)

    一.循环 1.for names = ['Michal', 'Bob', 'tracy'] for name in names: print(name) sum = 0 for x in [1, 2, ...

  5. sql百万级查询优化(转)

    < 数据库技术内幕 > 处理百万级以上的数据提高查询速度的方法: 1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 2.对查询进 ...

  6. Spring的几种注入bean的方式

    在Spring容器中为一个bean配置依赖注入有三种方式: · 使用属性的setter方法注入  这是最常用的方式: · 使用构造器注入: · 使用Filed注入(用于注解方式).   使用属性的se ...

  7. Zookeeper浏览器工具和Eclipse插件

    公司很多产品会使用zookeeper,比如Meta消息中间件,在测试的过程中,我们经常需要查询zookeeper里面的信息来精确定位问题.目前项目中有开发团队自己写的浏览器node-zk-browse ...

  8. java关键字总结

    static: 用来修饰成员变量和成员方法,也可以形成静态static代码块,可以形成静态内部类,也可以用于静态导包. 1.静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实 ...

  9. python heapq模块使用

    Python内置的heapq模块 Python3.4版本中heapq包含了几个有用的方法: heapq.heappush(heap,item):将item,推入heap >>> it ...

  10. python格式化日期

    #!/usr/bin/python # -*- coding: UTF-8 -*- import time import calendar """ 时间元组(年.月.日. ...