zoukankan      html  css  js  c++  java
  • 第三讲JdbcRealm及Authentication Strategy

    1、使用shiro框架来完成认证工作,默认情况下使用的是IniRealm。如果需要使用其他Realm,那么需要进行相关的配置。

    2、ini配置文件讲解:

      [main] section是你配置应用程序的SecurityManager实例及任何它的依赖组件(如Realms)的地方。

    [main]
    myRealm=cn.sun.realm.MyRealm
    #依赖注入
    securityManager.realm=$myRealm

      [users] section允许你定义一组静态的用户账户。在这大部分拥有少数用户账户或用户账户不需要运行时被动态地创建的环境下是很有用的。

    [users]
    zhangsan=1111
    lisi=2222,role1,role2

      [roles] section允许你把定义在[users] section中的角色与权限关联起来。另外,这在大部分拥有少数用户账户或用户账户不需要再运行时被动态地创建的环境下是很有用的。

    [users]
    zhangsan=1111,role1
    [roles]
    role1=user:add,user:delete

    3、使用JdbcRealm来完成身份认证

      通过观察JdbcRealm可知,要实现JdbcRealm:

      (1)需要为jdbcRealm设置dataSource

      (2)在指定的dataSource所对应的数据库中应有用户表users,该表中应该有username,password,password_salt等

    4、实现步骤

      (1)新建数据库表

        

      (2)配置shiro.ini文件

     1 [main]
     2 #配置数据源
     3 dataSource=com.alibaba.druid.pool.DruidDataSource
     4 dataSource.url=jdbc:mysql://127.0.0.1:3306/shiro?serverTimezone=GMT%2B8
     5 dataSource.driverClassName=com.mysql.cj.jdbc.Driver
     6 dataSource.username=root
     7 dataSource.password=root
     8 jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm
     9 # $表示引用对象
    10 jdbcRealm.dataSource=$dataSource
    11 securityManager.realm=$jdbcRealm

      说明:特别要注意连接池配置关键字:url,driverClassName,username,password  

      (3)测试

    JdbcDemo.java

     1 package com.sun123.shiro;
     2 
     3 import org.apache.shiro.SecurityUtils;
     4 import org.apache.shiro.authc.IncorrectCredentialsException;
     5 import org.apache.shiro.authc.UnknownAccountException;
     6 import org.apache.shiro.authc.UsernamePasswordToken;
     7 import org.apache.shiro.config.IniSecurityManagerFactory;
     8 import org.apache.shiro.util.Factory;
     9 //java.lang中有SecurityManager的包,需要改成Apache的
    10 import org.apache.shiro.mgt.SecurityManager;
    11 import org.apache.shiro.subject.Subject;
    12 
    13 public class JdbcDemo {
    14 
    15     public static void main(String[] args) {
    16         // 1、创建SecurityManager工厂,读取相应的配置文件
    17         Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
    18         // 2、通过SecurityManager工厂获取SecurityManager的实例
    19         SecurityManager securityManager = factory.getInstance();
    20         // 3、将securityManager对象设置到运行环境中
    21         SecurityUtils.setSecurityManager(securityManager);
    22         // 4、通过SecurityUtils获取主体Subject
    23         Subject subject = SecurityUtils.getSubject();
    24         // 5、加入登录的用户名zhangsan和1111,这个地方的zhangsan和1111表示用户登录时输入的信息
    25         // 而shiro.ini文件中的信息相当于数据库中存放的信息
    26         // UsernamePasswordToken token = new UsernamePasswordToken("zhangsan", "111");
    27         UsernamePasswordToken token = new UsernamePasswordToken("wangwu", "111");
    28         try {
    29             // 6、进行用户身份验证
    30             subject.login(token);
    31             // 7、通过subject来判断用户是否通过验证
    32             if (subject.isAuthenticated()) {
    33                 System.out.println("验证通过");
    34             }
    35         } catch (UnknownAccountException e) {// AuthenticationException为父异常 Ctrl+T看子异常
    36             System.out.println("用户名/密码不正确");
    37         } catch (IncorrectCredentialsException e) {// AuthenticationException为父异常 Ctrl+T看子异常
    38             System.out.println("用户名或密码不正确");
    39         }
    40 
    41     }
    42 }

    log4j.properties

    1 log4j.rootLogger=debug, stdout 
    2 log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
    3 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
    4 log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m %n

    代码运行结果:

    5、Authentication Strategy:认证策略,在shiro中有3种认证策略

      (1)AtleastOneSuccessfulStrategy:如果一个(或更多)Realm 验证成功, 则整体的尝试被认为是成功的。 如果没有一个验证成功,则整体尝试失败。

      (2)FirstSuccessfulStrategy:只要有第一个成功地验证的 Realm返回的信息将被使用 。所有进一步的Realm将被忽略。如果没有一个验证成功, 则整体尝试失败。

      (3)AIISucessfulStrategy:为了整体的尝试成功,所有配置的Realm必须验证成功。如果没有一个验证成功,则整体尝试失 败。

      默认的策略是:AtleastOneSuccessfulStrategy

    6、设置认证策略

    1 #验证策略设置
    2 authenticationStrategy=org.apache.shiro.authc.pam.AllSuccessfulStrategy
    3 securityManager.authenticator.authenticationStrategy=$authenticationStrategy
  • 相关阅读:
    接口表与临时表的用途
    mac电脑连接oracle报错ora-24454,客户主机名未设置
    项目管理口径与法人管理口径会计分录公司信息生成问题
    关于接口的一些理解
    梳理EBS系统中上下文的概念和用法
    数据库系统的用途浅析
    EBS与外围系统数据的交互方式——接口表与API的区别
    四年EBS系统顾问风雨之路回顾——002话
    Web服务器处理请求过程浅谈
    ZOOKEEPER+KAFKA 集群搭建
  • 原文地址:https://www.cnblogs.com/116970u/p/10948921.html
Copyright © 2011-2022 走看看