鲁春利的工做笔记,好记性不如烂笔头html
SecurityManagerjava
Shiro是从根对象SecurityManager进行身份验证和受权的;这个对象是线程安全且真个应用只须要一个便可,所以Shiro 提供了SecurityUtils 让咱们绑定它为全局的,方便后续操做。mysql
一、纯Java 代码写法web
@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()); }
二、等价的INI配置spring
shiro-ini-equals-program.inisql
[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
单元测试apache
@Test public void testConfigSecurityManager () { // 一、获取SecurityManager工厂,此处使用Ini配置文件初始化SecurityManager Factory<org.apache.shiro.mgt.SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro/ini/shiro-ini-equals-program.ini"); // 二、获得SecurityManager实例并绑定给SecurityUtils org.apache.shiro.mgt.SecurityManager securityManager = factory.getInstance(); SecurityUtils.setSecurityManager(securityManager); // 三、获得Subject及建立用户名/密码身份验证Token(即用户身份/凭证) Subject subject = SecurityUtils.getSubject(); /* * 用户身份Token 可能不单单是用户名/密码,也可能还有其余的,如登陆时容许用户名/邮箱/手机号同时登陆。 */ UsernamePasswordToken token = new UsernamePasswordToken("lucl", "123"); try{ // 四、登陆,即身份验证 subject.login(token); } catch (AuthenticationException e) { // 五、身份验证失败 e.printStackTrace(); } // 测试经过 Assert.assertTrue(subject.isAuthenticated()); // 六、退出 subject.logout(); }
说明:安全
即便没接触过IoC 容器的知识,如上配置也是很容易理解的:
一、对象名=全限定类名相对于调用public 无参构造器建立对象
二、对象名.属性名=值至关于调用setter方法设置常量值
三、对象名.属性名=$对象引用至关于调用setter方法设置对象引用ide
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 () { // 一、获取SecurityManager工厂,此处使用Ini配置文件初始化SecurityManager Factory<org.apache.shiro.mgt.SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro/ini/shiro-ini-config.ini"); // 二、获得SecurityManager实例并绑定给SecurityUtils org.apache.shiro.mgt.SecurityManager securityManager = factory.getInstance(); SecurityUtils.setSecurityManager(securityManager); // 三、获得Subject及建立用户名/密码身份验证Token(即用户身份/凭证) Subject subject = SecurityUtils.getSubject(); UsernamePasswordToken token = new UsernamePasswordToken("lucl", "123"); try{ // 四、登陆,即身份验证 subject.login(token); } catch (AuthenticationException e) { // 五、身份验证失败 logger.info("用户身份验证失败"); e.printStackTrace(); } // 用户身份获得确认 if (subject.isAuthenticated()) { logger.info("用户登陆成功。"); /** * 进行权限判断 */ // 判断是否拥有权限 Assert.assertTrue(subject.isPermitted("system:edit:1")); } else { logger.info("用户登陆失败。"); } // 六、退出 subject.logout(); }