• 欢迎访问VPS岛网站,国外VPS,国内VPS,国外服务器,国内服务器,服务器主机,测评及优惠码,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站 QQ群

Apache Shiro学习笔记(四)INI配置

Apache技术 luchunli1985 14次浏览 已收录 0个评论

鲁春利的工作笔记,好记性不如烂笔头


SecurityManager

Shiro是从根对象SecurityManager进行身份验证和授权的;这个对象是线程安全且真个应用只需要一个即可,因此Shiro 提供了SecurityUtils 让我们绑定它为全局的,方便后续操作。

1、纯Java 代码写法

@Test
public void testProgramSecurityManager () {
    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 dataSource = new DruidDataSource();
    dataSource.setDriverClassName("com.mysql.jdbc.Driver");
    dataSource.setUrl("jdbc:mysql://localhost:3306/spring_test");
    dataSource.setUsername("root");
    dataSource.setPassword("Mvtech123!@");
    JdbcRealm jdbcRealm = new JdbcRealm();
    jdbcRealm.setDataSource(dataSource);
    // Enables lookup of permissions during authorization.
    jdbcRealm.setPermissionsLookupEnabled(true);
    securityManager.setRealm(jdbcRealm);
    
    // 将SecurityManager设置到SecurityUtils 方便全局使用
    SecurityUtils.setSecurityManager(securityManager);
    
    Subject subject = SecurityUtils.getSubject();
    UsernamePasswordToken token = new UsernamePasswordToken("lucl", "123");
    subject.login(token);
    
    // 测试通过
    Assert.assertTrue(subject.isAuthenticated());
}

2、等价的INI配置

  • shiro-ini-equals-program.ini

[main]
#authenticator
authenticator=org.apache.shiro.authc.pam.ModularRealmAuthenticator
authenticationStrategy=org.apache.shiro.authc.pam.AtLeastOneSuccessfulStrategy
authenticator.authenticationStrategy=$authenticationStrategy
securityManager.authenticator=$authenticator

#authorizer
authorizer=org.apache.shiro.authz.ModularRealmAuthorizer
permissionResolver=org.apache.shiro.authz.permission.WildcardPermissionResolver
authorizer.permissionResolver=$permissionResolver
securityManager.authorizer=$authorizer

#dataSource
dataSource=com.alibaba.druid.pool.DruidDataSource
dataSource.driverClassName=com.mysql.jdbc.Driver
dataSource.url=jdbc:mysql://localhost:3306/spring_test
dataSource.username=root
dataSource.password=Mvtech123!@

#realm
jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm
jdbcRealm.dataSource=$dataSource
jdbcRealm.permissionsLookupEnabled=true

securityManager.realms=$jdbcRealm
  • 单元测试

@Test
    public void testConfigSecurityManager () {
        // 1、获取SecurityManager工厂,此处使用Ini配置文件初始化SecurityManager
        Factory<org.apache.shiro.mgt.SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro/ini/shiro-ini-equals-program.ini");
        
        // 2、得到SecurityManager实例并绑定给SecurityUtils
        org.apache.shiro.mgt.SecurityManager securityManager = factory.getInstance();
        SecurityUtils.setSecurityManager(securityManager);
        
        // 3、得到Subject及创建用户名/密码身份验证Token(即用户身份/凭证)
        Subject subject = SecurityUtils.getSubject();
        /* 
         * 用户身份Token 可能不仅仅是用户名/密码,也可能还有其他的,如登录时允许用户名/邮箱/手机号同时登录。
         */
        UsernamePasswordToken token = new UsernamePasswordToken("lucl", "123");
        
        try{
            // 4、登录,即身份验证
            subject.login(token);
        } catch (AuthenticationException e) {
            // 5、身份验证失败
            e.printStackTrace();
        }
                
        // 测试通过
        Assert.assertTrue(subject.isAuthenticated());
        
        // 6、退出
        subject.logout();
    }

说明:

即使没接触过IoC 容器的知识,如上配置也是很容易理解的:
1、对象名=全限定类名相对于调用public 无参构造器创建对象
2、对象名.属性名=值相当于调用setter方法设置常量值
3、对象名.属性名=$对象引用相当于调用setter方法设置对象引用

Ini配置文件示例

[main]
# 提供了对根对象securityManager及其依赖的配置
securityManager=org.apache.shiro.mgt.DefaultSecurityManager
…………
securityManager.realms=$jdbcRealm

[users]
#提供了对用户/密码及其角色的配置,用户名=密码,角色1,角色2
username=password,role1,role2

[roles]
#提供了角色及权限之间关系的配置,角色=权限1,权限2
role1=permission1,permission2

[urls]
#用于web,提供了对web url拦截相关的配置,url=拦截器[参数],拦截器
/index.html = anon
/admin/** = authc, roles[admin], perms["permission1"]

测试INI配置的身份认证与授权

  • shiro-ini-config.ini

[users]
lucl=123,role1

[roles]
role1=system:view:1,system:edit:1,user:update:2

测试代码

/**
 * 基于资源的访问控制(ini配置)
 */
@Test
public void testWhetherHasPermissionInIni () {
    // 1、获取SecurityManager工厂,此处使用Ini配置文件初始化SecurityManager
    Factory<org.apache.shiro.mgt.SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro/ini/shiro-ini-config.ini");
    
    // 2、得到SecurityManager实例并绑定给SecurityUtils
    org.apache.shiro.mgt.SecurityManager securityManager = factory.getInstance();
    SecurityUtils.setSecurityManager(securityManager);
    
    // 3、得到Subject及创建用户名/密码身份验证Token(即用户身份/凭证)
    Subject subject = SecurityUtils.getSubject();

    UsernamePasswordToken token = new UsernamePasswordToken("lucl", "123");
    try{
        // 4、登录,即身份验证
        subject.login(token);
    } catch (AuthenticationException e) {
        // 5、身份验证失败
        logger.info("用户身份验证失败");
        e.printStackTrace();
    }
    
    // 用户身份得到确认
    if (subject.isAuthenticated()) {
        logger.info("用户登录成功。");
        /**
         * 进行权限判断
         */
        // 判断是否拥有权限
        Assert.assertTrue(subject.isPermitted("system:edit:1"));
    } else {
        logger.info("用户登录失败。");
    }

    // 6、退出
    subject.logout();
}



VPS岛 的文章和资源来自互联网,仅作为参考资料,如果有侵犯版权的资源请尽快联系站长,我们会在24h内删除有争议的资源。丨 转载请注明Apache Shiro学习笔记(四)INI配置
喜欢 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址