zoukankan      html  css  js  c++  java
  • java开源安全框架-------Apache Shiro--第二天

    身份验证

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

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

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

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

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

      另外两个相关的概念就是之前提到的Subject和Realm,分别是主体和验证主体的数据源

      一、环境准备

      本文使用Maven构建,因此需要一点Maven知识,首先准备Maven环境依赖

      添加junit、common-logging及shiro-core依赖即可。

      

    二、登录、退出

      1、首先准备一些用户/身份凭据(shiro.ini)

    此处使用ini配置文件,通过users指定两个主体zhang/123 wang/123

      2、测试用例(com.github.zhangkaitao.shiro.chapter2.LoginLogoutTest) 

      

      2.1、首先通过new iniSecurityManagerFactory 并指定一个ini配置文件来创建一个SecuriryManager工厂

      2.2、接着获取SecurityManager并绑定到SecurityUtils,这是一个全局设置,设置一次即可。

      2.3、通过SecurityUtils得到Subject,其会自动绑定到当前线程;如果在web环境在请求结束是需要解除绑定;然后获取身份验证的Token,如用户名、密码

      2.4、调用Subject的login方法进行登录,其会自动委托给SecurityManager.login方法进行登录

      2.5、如果身份验证失败,请捕获AuthenticationException或其子类,常见的如(DesabledAccountException禁用的账号)、lockedAccountException(锁定的账号)、UnkownAccountException(错误的账号) ExcessiveAttemptsException(登录失败次数哦过多)、incorrectCredentialsException(错误的凭证)

    ExpiredCredentialsException(过期的凭证) 等,具体请查看继承关系;对于页面的错误消息展示,最好的使用如(用户名、密码错误而不是用户名错误 密码错误),防止一些恶意用户非法扫描账户库。

      2.6、最后可以调用Subject.logout退出,其会自动委托给SecurityManager.logout方法退出

     从如上代码可以总结出身份验证的步骤

      1、收集用户身份、凭证,即如用户名、密码

      2、调用Subject.login方法进行登录,如果用户登录失败将得到相应的AuthenticationException异常,根据异常提供用户错误信息;否则登录成功。

      3、最后调用Subjject.logout方法进行退出

    如上测试几个问题

    、 1、用户名、密码硬编码到ini配置文件,以后需要改成如数据库存储,且密码需要加密处理

      2、用户身份Token可能不仅仅是用户名、密码,也可能还有其他的,如登录时允许用户名/邮箱/手机号/同时登录

      三、身份认证流程

       

      流程如下

      1、首先调用Subject.login(token)进行登录,其会自动委托给SecurityManger;调用之前必须通过SecurityUtils.setSecurityManager设置

      2、SecurityManager负责真正的身份认证逻辑,它会委托给Authentication进行身份验证

      3、Authentication才是真正的身份验证着,Shiro Api中核心的身份认证入口

      4、Authentication可能会委托给相应的AuthenticationStrategy进行多个Realm身份验证,默认ModularRealmAuthenticationtor会调用AuthenticationStrategy进行多Realm身份验证

      5、Authenticationtor会把相应的Token传入Realm,从Realm中获取身份验证信息,如果没有返回抛出异常信息,表示身份验证失败了。此处可以配置多个Realm,将按照相应的顺序即策略进行访问

      四、Realm

      域:Shiro从Realm中获取安全数据(如用户、角色、权限) ,就是说SecurityManager要验证用户身份,那么它需要从Realm获取相应的用户进行比较以确认用户身份是否合法,也需要从Realm中得到相应的角色/权限进行验证用户是否能进行操作;可以把Realm看成dataSource,即安全数据源,如我们之前的ini配置方式将使用org.apache.shiro.realm.text.IniRealm

      org.apache.shiro.realm.Realm接口如下: 

      

      

     五、Shiro踢狗默认的Realm

      

      以后一般继承AuthorizingRealm(授权)即可,其继承了AuthenticatingRealm(即身份认证) ,而且也间接继承了CashingRealm(带有缓存实现)。其中主要默认实现如下

      org.apache.shiro.realm.text.iniRealm:[Users]部分指定用户名/密码及其角色;[]roles部分指定角色(即权限信息)

      org.apache.shiro.realm.text.PropertiesRealm:user username=password,role1,role2指定用户名/密码及其角色;role:role1=permission1,permission2指定角色及其权限信息

      org.apache.shiro.jdbc.jdbcRealm:通过sql查询相应的信息如“select password from users where username = ?”获取用户密码,“select password, password_salt from users where username   = ?”获取用户密码及盐;“select role_name from user_roles where username = ?”获取用户角色;“select permission from roles_permissions where role_name = ?”获取角色对应的权限信息;也可以调用相应的api进行自定义sql;

      

      1、变量名 =全限定类名会自动创建一个类实例

      2、变量名.属性 = 值 自动调用相应的setter方法进行赋值

      3、$变量名 引用之前的的一个对象实例

      4、测试代码请参照com.github.zhangkaitao.shiro.chapter2.LoginLogoutTest的testJDBCRealm方法,和之前的没什么区别。

  • 相关阅读:
    problems_jenkins
    JAVA异常处理之finally中最好不要使用return
    IntelliJ idea学习资源
    Mybatis 的分页条件查询语句编写
    maven相关的学习资料
    git相关的学习资料
    开端三(1)
    开端2(2)
    C# 排序小测试
    想为一个类定义[][]方法
  • 原文地址:https://www.cnblogs.com/hanxue112253/p/7646386.html
Copyright © 2011-2022 走看看