shiro学习笔记(2)--认证策略

一:shiro认证策略
1、三种认证策略的实现,可根据需要选择
shiro学习笔记(2)--认证策略_第1张图片
2、认证策略配置在ModularRealmAuthenticator中;我画了一个简单的流程图,粗浅理解一下
shiro学习笔记(2)--认证策略_第2张图片
说明:
(1)subject通过实现类DelegatingSubject调用login()方法;
(2)委托SecurityManager处理,安全管理器调用底层实现DefaultSecurityManager的login()方法;
(3)DefaultSecurityManager实际调用AuthenticatingSecurityManager的authenticate(AuthenticationToken token)方法;
(4)从图中看出继承关系,在RealmSecurityManager中注入Realm,在AuthenticatingSecurityManager中注入认证器实现类ModularRealmAuthenticator
(5)认证器实现类ModularRealmAuthenticator中注入认证策略AuthenticationStrategy类型实现
二:代码实现
1、main方法

public static void main(String[] args) {
        Factory factory = new IniSecurityManagerFactory("classpath:shiro/shiro3.ini");
        SecurityManager securityManager = factory.getInstance();
        SecurityUtils.setSecurityManager(securityManager);

        Subject subject = SecurityUtils.getSubject();
        try {
            UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken("ke", "123654");
            subject.login(usernamePasswordToken);
            if (subject.isAuthenticated()) {
                System.out.println("认证成功");
                String s = (String)subject.getPrincipal();
                System.out.println(s);
            }
        }catch (Exception e){
            System.out.println("认证失败");
            e.printStackTrace();
        }
    }

2、ini配置
说明:注入实际调用set()方法,为此必须有set方法才能注入
1、配置dataSource并注入到Realm中
2、配置Relam并注入到SecurityManager中
3、配置策略authenticationStrategy并注入到SecurityManager中
4、配置多个Realm时,注入的是Realms

#shiro 认证策略demo
#注入的对象名称要有对应的set方法。

[main]
#配置数据源
dataSource=org.apache.commons.dbcp.BasicDataSource
dataSource.driverClassName=com.mysql.jdbc.Driver
dataSource.url=jdbc:mysql://127.0.0.1:3306/shiro
dataSource.username=root
dataSource.password=123456

dataSource1=org.apache.commons.dbcp.BasicDataSource
dataSource1.driverClassName=com.mysql.jdbc.Driver
dataSource1.url=jdbc:mysql://127.0.0.1:3306/test1
dataSource1.username=root
dataSource1.password=123456

#配置realm $表示引用对象
jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm
jdbcRealm.dataSource=$dataSource

jdbcRealm1=org.apache.shiro.realm.jdbc.JdbcRealm
jdbcRealm1.dataSource=$dataSource1

#配置认证策略
#authenticationStrategy=org.apache.shiro.authc.pam.AtLeastOneSuccessfulStrategy
authenticationStrategy=org.apache.shiro.authc.pam.FirstSuccessfulStrategy
#authenticationStrategy=org.apache.shiro.authc.pam.AllSuccessfulStrategy

#配置securityManager
securityManager.realms=$jdbcRealm,$jdbcRealm1
securityManager.authenticator.authenticationStrategy=$authenticationStrategy

你可能感兴趣的:(shiro)