上篇文章中是使用的默认realm来实现的简单登录,这仅仅只是个demo,真正项目中使用肯定是需要连接数据库的
首先创建自定义realm文件,如下:
在shiro中注入自定义realm的完全限定类名:
1 [main] 2 # your custom realm path 3 fooRealm=com.lee.shiro.realm.FooRealm 4 # DI such as spring DI 5 securityManager.realms=$fooRealm
自定义realm认证:
1 /** 2 * 设置realm的名称 3 */ 4 @Override 5 public void setName(String name) { 6 super.setName("fooRealm"); 7 } 8 9 /** 10 * 认证 11 */ 12 @Override 13 protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { 14 15 // token是用户输入的相关信息 16 // 从token中取出身份信息, 即用户的username 17 String username = (String)token.getPrincipal(); 18 19 // 根据用户名username从数据库查询密码password 20 // 如果查询不到返回null 21 // String password = userService.queryPwdByUserName(username) 22 23 // 假设数据库查询出来的密码为如下 24 String password = "1234567"; 25 26 // 如果查询到返回认证信息AuthenticationInfo 27 SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(username, password, this.getName()); 28 29 return simpleAuthenticationInfo; 30 }
执行认证:
/** * * @Description: 自定义realm * * @author leechenxiang * @date 2016年6月11日 下午9:07:27 */ @Test public void testFooRealm() { // 创建SecurityManager工厂,通过ini配置文件创建 SecurityManager工厂 Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro/shiro-realm.ini"); // 创建SecurityManager SecurityManager securityManager = factory.getInstance(); // 设置SecurityManager到运行环境中,保持单例模式 SecurityUtils.setSecurityManager(securityManager); // 从SecurityUtils里边创建一个subject Subject subject = SecurityUtils.getSubject(); // 在认证提交前准备token(令牌) // 这里的账号和密码 将来是由用户输入进去 UsernamePasswordToken token = new UsernamePasswordToken("lee", "123456"); try { // 执行认证提交 subject.login(token); } catch (AuthenticationException e) { e.printStackTrace(); } // 是否认证通过 boolean isAuthenticated = subject.isAuthenticated(); System.out.println("是否认证通过:" + isAuthenticated); }
done...