1、javaConfig版 public void config(){DefaultSecurityManager securityManager = new DefaultSecurityManager();/** * 设置authenticator(身份认证器,处理登录,可能会有多账号登录情况, * 比如用手机号码登录或用邮
public void config(){ DefaultSecurityManager securityManager = new DefaultSecurityManager(); /** * 设置authenticator(身份认证器,处理登录,可能会有多账号登录情况, * 比如用手机号码登录或用邮箱登录) */ ModularRealmAuthenticator authenticator = new ModularRealmAuthenticator(); //设置认证规则,多个realm,一个成功即通过认证 authenticator.setAuthenticationStrategy( new AtLeastOneSuccessfulStrategy()); securityManager.setAuthenticator(authenticator); //设置authorizer(权限管理,管理“修改”,“删除”等权限) ModularRealmAuthorizer authorizer = new ModularRealmAuthorizer(); /** * 设置权限解析器(我们的权限信息以字符串形式存放,权限解析器实质上是处理字符串解析) * WildcardPermissionResolver是shiro提供的基础实现,我们可以继承 * PermissionResolver接口重写我们自己的权限解析器 */ authorizer.setPermissionResolver(new WildcardPermissionResolver()); securityManager.setAuthorizer(authorizer); //设置alibaba数据库连接池 DruidDataSource dataSource = new DruidDataSource(); dataSource.setDriverClassName("com.mysql.jdbc.Driver"); dataSource.setUrl("jdbc:mysql://localhost:3306/shiro_test"); dataSource.setUsername("root"); dataSource.setPassword("123"); /** * 设置Realm(就是我们获取用户/权限的类,可能存在数据库中, * 可能存在LDAP中,可能存在redis中),一般Realm是我们自己实现的 * 实现AuthorizingRealm接口即可实现Realm * 我们这里使用shiro提供的处理数据库的Realm:JdbcRealm */ JdbcRealm realm = new JdbcRealm(); realm.setDataSource(dataSource); realm.setPermissionsLookupEnabled(true); securityManager.setRealm(realm); SecurityUtils.setSecurityManager(securityManager); Subject subject = SecurityUtils.getSubject(); UsernamePasswordToken token = new UsernamePasswordToken("zhang","123"); subject.login(token); Assert.assertTrue(subject.isAuthenticated()); }2、相对应的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/shiro_test dataSource.username=root dataSource.password=123 #realm jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm jdbcRealm.dataSource=$dataSource jdbcRealm.permissionsLookupEnabled=true securityManager.realms=$jdbcRealm3、ModularRealmAuthenticator解析
/** * 验证用户账号处理:shiro提供的实现ModularRealmAuthenticator用来处理多realm, * (Realm是确定用户身份是否合法;也需要从Realm得到用户相应的角色/权限进行验证用户是否能进行操作, * 也就是说一个Realm认证一个身份。我们的web应用可能会提供用户多账号登录功能,如手机号登录,邮箱登录,微信登录; * 无论用什么登录,登录的是唯一的账号) * ModularRealmAuthenticator中要加入验证规则AuthenticationStrategy的 * 实现,而验证规则要实现AuthenticationStrategy接口,shiro实现了下面几种验 * 证规则: * 1、FirstSuccessfulStrategy:只要有一个Realm验证成功即可, * 只返回第一个Realm身份验证成功的认证信息,其他的忽略; * 2、AtLeastOneSuccessfulStrategy:只要有一个Realm验证成功即可, * 和FirstSuccessfulStrategy不同,返回所有Realm身份验证 * 成功的认证信息; * 3、AllSuccessfulStrategy:所有Realm验证成功才算成功,且返回所有 * Realm身份验证成功的认证信息,如果有一个失败就失败了。 * */ //如果上面几种验证规则不适合我们,我们可以重写验证策略 class MyAuthenticationStrategy implements AuthenticationStrategy{ //在所有Realm验证之前调用 @Override public AuthenticationInfo beforeAllAttempts( Collection realms, AuthenticationToken token) throws AuthenticationException { return null; } //在每个Realm之前调用 @Override public AuthenticationInfo beforeAttempt(Realm realm, AuthenticationToken token, AuthenticationInfo aggregate) throws AuthenticationException { return null; } //在每个Realm之后调用 @Override public AuthenticationInfo afterAttempt(Realm realm, AuthenticationToken token, AuthenticationInfo singleRealmInfo, AuthenticationInfo aggregateInfo, Throwable t) throws AuthenticationException { return null; } //在所有Realm验证之后调用 @Override public AuthenticationInfo afterAllAttempts(AuthenticationToken token, AuthenticationInfo aggregate) throws AuthenticationException { return null; } }