Shiro最佳实践(三)基于ini配置文件认证

Apache Shiro
placeholder image
admin 发布于: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(usernamepassword);
        
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

 运行结果

image.png

 点赞


 发表评论

当前回复:作者

 评论列表


留言区