1. jdbcRealm已经实现了从数据库中获取用户来验证信息,但是jdbcRealm灵活性太差。如果要实现自己的一些特殊应用时将不能支持。这个时候我们可以通过自定义Realm来实现身份的认证功能。
2. Realm是一个接口,在接口中定义了根据token获得认证信息的方法,shiro内容实现了一系列的realm。这些不同的Realm实现类提供了不同的功能。AutenticationRealm实现了获取身份信息的功能,AuthorizingRealm实现了获取权限信息的功能,通常自定义Realm需要继承AuthorizingRealm,既这样可以提供了身份认证的自定义方法,也可以实现授权的自定义方法。
3. 实现自定义Realm
/** * 自定义realm的实现 该realm类提供了两个方法 * doGetAuthenticationInfo 获取认证信息 * doGetAuthorizationInfo 获取权限信息 */ public class UserRealm extends AuthorizingRealm{ @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) { return null; } }
注意:使用shiro来完成权限管理,shiro并不会去维护数据。Shiro中使用的数据,需要程序员根据处理业务将数据传递给shiro的相应接口。