根对象securityManager

  • Shiro是从根对象SecurityManager进行身份验证和授权的,所有操作都是自它开始。这个对象是线程安全的且整个应用只需要一个即可。因此shiro提供了SecurityUtils让我们绑定它为全局的。

Java Configuration

  • 用Java代码代替ini配置

    public class NonConfigurationCreateTest {
        @Test
        public void test(){
            DefaultSecurityManager securityManager=new DefaultSecurityManager();
    
            //设置authenticator
            ModularRealmAuthenticator authenticator=new ModularRealmAuthenticator();
            authenticator.setAuthenticationStrategy(new AtLeastOneSuccessfulStrategy());
            securityManager.setAuthenticator(authenticator);
    
            //设置authorizer
            ModularRealmAuthorizer authorizer=new ModularRealmAuthorizer();
            authorizer.setPermissionResolver(new WildcardPermissionResolver());
            securityManager.setAuthorizer(authorizer);
    
            //设置Realm
            DruidDataSource ds=new DruidDataSource();
            ds.setDriverClassName("com.mysql.jdbc.Driver");
            ds.setUrl("jdbc:mysql://localhosr:3306/shiro");
            ds.setUsername("root");
            ds.setPassword("123456");
            JdbcRealm jdbcRealm=new JdbcRealm();
            jdbcRealm.setDataSource(ds);
            jdbcRealm.setPermissionsLookupEnabled(true);
            securityManager.setRealms(Arrays.asList((Realm)jdbcRealm));
    
            //SecurityManager设置到SecurityUtils,方便全局使用
            SecurityUtils.setSecurityManager(securityManager);
    
            //测试
            Subject subject=SecurityUtils.getSubject();
            UsernamePasswordToken token=new UsernamePasswordToken("zhang","123");
            subject.login(token);
            Assert.assertTrue(subject.isAuthenticated());
        }
    }
    

ini配置文件

  • ini配置下,securityManager的获取如下

    Factory<org.apache.shiro.mgt.SecurityManager> factory =  
     new IniSecurityManagerFactory("classpath:shiro-config.ini"); 
    
    SecurityManager securityManager = factory.getInstance();
    
  • IniSecurityManagerFactory是创建securityManager的工厂,它需要一个ini配置文件路径,支持“classpath:”(类路径)、“file:”(文件系统)、“url:”(网络)三种路径格式,默认是文件系统。
  • 默认创建DefaultSecurityManager类型的securityManager,如果想自定义,需要在ini配置文件中指定securityManager=SecurityManager实现类;名字必须为securityManager。
  • ini配置文件其中几部分

    [main]
    #提供了对根对象securityManager及其依赖的配置
    securityManager=org.apache.shiro.mgt.DefaultSecurityManager
    …………
    securityManager.realms=$jdbcRealm
    
    [urls]
    #用于web,提供了对web url拦截相关的配置,url=拦截器[参数],拦截器
    /index.html = anon
    /admin/** = authc, roles[admin], perms["permission1"]
    
  • Array/Set/List注入

    //多个之间用,分开即可
    authenticator.array=1,2,3 
    authenticator.set=$jdbcRealm,$jdbcRealm&nbsp;
    
  • Map键值对注入

    authenticator.map=$jdbcRealm:$jdbcRealm,1:1,key:abc //常量都看作字符串,如,1,abc
    
  • [users]部分

    [users]  
    #提供了对用户/密码及其角色的配置,用户名=密码,角色1,角色2  
    username=password,role1,role2
    
  • 其中,密码一般生成其摘要或加密存储。
  • [roles]部分:如果只有角色没有对应的权限,可以不配[roles]