第四讲 自定义Realm来实现身份认证

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

 

posted @ 2019-05-30 22:54  清晨的第一抹阳光  阅读(717)  评论(0编辑  收藏  举报