根对象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
Map键值对注入
authenticator.map=$jdbcRealm:$jdbcRealm,1:1,key:abc //常量都看作字符串,如,1,abc
[users]部分
[users] #提供了对用户/密码及其角色的配置,用户名=密码,角色1,角色2 username=password,role1,role2
- 其中,密码一般生成其摘要或加密存储。
- [roles]部分:如果只有角色没有对应的权限,可以不配[roles]
- 重复注入则后面的覆盖前面的。
- 代码实例:ideaProjects/shiroHelloWorld/chapter4
- 《跟我学Shiro第四章》