1、jdbcReam已经实现了从数据库中获取用户的验证信息,但是jdbcRealm灵活性太差。如果要实现自己的一些特殊应用时,将不能支持。这时,可以通过自定义Realm来实现身份的认证功能。
2、Realm是一个接口,在接口中定义了根据token获得认证信息的方法。Shiro内容实现了一系列的realm。这些不同的Realm实现类提供了不同的功能。AuthenticatingRealm实现了获取身份信息的功能。AuthorizingRealm实现了获取权限信息的功能。通常自定义Realm需要继承AuthorizingRealm,这样既可以提供身份认证的自定义方法,也可以实现授权的自定义方法。
3、实现自定义Realm
package com.sun123.realm; import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.AuthenticationInfo; import org.apache.shiro.authc.AuthenticationToken; import org.apache.shiro.authc.SimpleAuthenticationInfo; import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.realm.AuthorizingRealm; import org.apache.shiro.subject.PrincipalCollection; public class UserRealm extends AuthorizingRealm { /** * 自定义realm的实现 该realm类提供了两个方法 * doGetAuthorizationInfo 获取认证信息 * doGetAuthenticationInfo 获取权限信息 */ @Override public String getName() { // 自定义 return "userRealm"; } // 完成身份认证,并且返回认证信息 // 如果身份认证失败,返回null @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { // 获取用户输入的用户名 String username = (String) token.getPrincipal();// 获取身份信息 System.out.println("username:" + username); // 根据用户名到数据库查询密码信息——模拟 // 假定从数据库获取的密码为1111 String pwd = "1111"; // 将从数据库中查询的信息封装到SimpleAuthenticationInfo中 SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(username, pwd, getName()); return info; } // 授权的信息 @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection arg0) { // TODO Auto-generated method stub return null; } }
注意:使用shiro来完成权限管理,shiro并不会去维护数据。Shiro中使用的数据,需要程序员根据处理业务将数据传递给shiro相应的接口。
shiro.ini
1 [main] 2 #自定义 3 userRealm=com.sun123.realm.UserRealm 4 securityManager.realm=$userRealm