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;
}
}
