Shiro最佳实践(三)基于ini配置文件认证
Apache Shiroadmin 发布于:2019-08-03 22:07:24
阅读:loading
其实在Shiro的多种认证方式中还包含有JdbcRealm的方式,其实现是根据username从数据库中查询用户密码信息、角色信息、权限信息,包括有用户密码的盐值加密,具体实现这里将不再给出了,需要提供DataSource、数据库表、数据等信息。
本篇文章实现使用ini类型的配置文件实现一个简单授权认证,所谓的ini类型文件我们也常有见到,如eclipse.ini、my.ini等,它是一种可按分组读取的键值对文件,比如shiro的用户账户信息约定采用user.前缀命名,那么在ini文件中则无需遵循,直接定义一个[user]组即可,在这个组内的参数可以根据组为前缀获取。
本篇文章将出多个认证的实现,所以将代码进行了抽象,保留了Realm部分的自定义实现,参考如下:
package cn.chendd.shiro.examples.login;
import ...
public abstract class LoginTest {
protected Logger logger = LoggerFactory.getLogger(this.getClass());
protected String username = "chendd";
protected String password = "www.chendd.cn";
protected Subject loginSubject;
public void testLogin(Realm realm) {
SecurityManager securityManager = new DefaultSecurityManager(realm);
SecurityUtils.setSecurityManager(securityManager);
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
try {
loginSubject = securityManager.login(subject, token);
if (loginSubject.isAuthenticated()) {
logger.debug("用户已经认证");
}
logger.info("用户名 {} 认证成功", loginSubject.getPrincipal());
} catch (AuthenticationException e) {
logger.error("用户名 {} 认证失败", username, e);
}
}
}
package cn.chendd.shiro.examples.login;
import ...
/**
* @author chendd
* 测试根据用户名与密码认证登录
*/
public class LoginUserTest extends LoginTest {
@Test
public void testLoginUser() {
logger.info("###测试登录----用户名 {} ,密码 {} ###" , username , password);
String resourcePath = "classpath:shiro/shiro-loginUser.ini";
Realm realm = new IniRealm(resourcePath);
super.testLogin(realm);//使用Ini配置文件读取参数的方式认证用户
}
}
#按用户名与密码登录
[users]
chendd=www.chendd.cn
点赞