shiro中自定义realm来实现身份认证

前言

jdbcRealm已经实现了从数据库中获取用户的认证信息,但是jdbcRealm灵活性太差。如果要实现一些特殊应用时将不能支持。这个时候可以通过自定义Realm来实现身份认证功能。

流程

Realm是一个接口,在接口中定义了根据token获得认证信息的方法。shiro内容实现了一系列的realm。这些不同Realm实现类提供了不同的功能。AuthenticationRealm实现了获取身份信息的功能,AuthorizingRealm实现了获取权限信息的功能。通常自定义Realm需要继承AuthorizingRealm,既可以提供身份认证的自定义方法也可以实现授权的自定义方法。

自定义Realm

1.自定义Realm实现

package cn.gtxd.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 获取权限信息
*
*
* */
public class UserRealm extends AuthorizingRealm {

    @Override
    public String getName(){
        return "userRealm";
    }

    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        return null;
    }

    //完成身份认证(从数据库中取数据)并且返回认证信息
    //如果身份认证失败,返回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;

    }
}

2.配置Realm

[main]
userRealm=cn.gtxd.realm.UserRealm
securityManager.realm=$userRealm


注意

使用shiro来完成权限管理,shiro并不会去维护数据。shiro中使用的数据,需要程序员根据处理业务将数据传递给shiro相应的接口。

你可能感兴趣的:(JavaEE)