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