shiro权限框架自定义realm认证测试精讲篇

shiro权限框架课程目标精讲篇(1)
shiro初识,全面介绍架构精讲篇
shiro三大核心组件介绍精讲篇
shiro配置jar包导入依赖精讲篇
shiro认证权限流程测试精讲篇
shiro权限授权测试精讲篇
shiro权限模型构建数据库表精讲篇
shiro权限框架自定义realm认证测试精讲篇
shiro散列算法密码加盐测试精讲篇
shiro权限管理自定义realm授权测试精讲篇
spring集成shiro不进入自定义realm是为什么?
shiro认证:连接数据库操作doGetAuthenticationInfo
shiro授权:链接数据库doGetAuthorizationInfo
shiro框架:缓存器
Ehcache配置时出错- Another unnamed CacheManager already exists in the same VM. Please provide unique name
shiro框架:缓存器Ehcache的详细配置流程
shiro框架:sessionManager设置数据会话的存储时间,账号密码到时间清空
shiro框架集成验证码验证配置流程
shiro框架:记住我remberMe自动登入

自定义Realm

上边的程序使用的是Shiro自带的IniRealm,IniRealm从ini配置文件中读取用户的信息,大部分情况下需要从系统的数据库中读取用户信息,所以需要自定义realm。

realm的接口

shiro权限框架自定义realm认证测试精讲篇_第1张图片
image.png

最基础的是Realm接口,CachingRealm负责缓存处理,AuthenticationRealm负责认证,AuthorizingRealm负责授权,通常自定义的realm继承AuthorizingRealm。

在认证、授权内部实现机制中都有提到,最终处理都将交给Real进行处理。因为在Shiro中,最终是通过Realm来获取应用程序中的用户、角色及权限信息的。通常情况下,在Realm中会直接从我们的数据源中获取Shiro需要的验证信息。可以说,Realm是专用于安全框架的DAO.

认证实现

Shiro的认证过程最终会交由Realm执行,这时会调用Realm的getAuthenticationInfo(token)方法。 �该方法主要执行以下操作: �1、检查提交的进行认证的令牌信息 �2、根据令牌信息从数据源(通常为数据库)中获取用户信息 �3、对用户信息进行匹配验证。 �4、验证通过将返回一个封装了用户信息的AuthenticationInfo实例。 �5、验证失败则抛出AuthenticationException异常信息。

配置shiro-realm.ini

[main]
#\u81ea\u5b9a\u4e49 realm
customRealm=cn.itcast.shiro.realm.CustomRealm
#\u5c06realm\u8bbe\u7f6e\u5230securityManager\uff0c\u76f8\u5f53 \u4e8espring\u4e2d\u6ce8\u5165
securityManager.realms=$customRealm

CustomRealm.java

shiro权限框架自定义realm认证测试精讲篇_第2张图片
image.png

CustomRealm.java

package cn.itcast.shiro.realm;

import java.util.ArrayList;
import java.util.List;

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.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;

/**
 * 
 * 

* Title: CustomRealm *

*

* Description:自定义realm *

*

* Company: www.itcast.com *

* * @author 传智.燕青 * @date 2015-3-23下午4:54:47 * @version 1.0 */ public class CustomRealm extends AuthorizingRealm { // 设置realm的名称 @Override public void setName(String name) { super.setName("customRealm"); } // 用于认证 @Override protected AuthenticationInfo doGetAuthenticationInfo( AuthenticationToken token) throws AuthenticationException { // token是用户输入的 // 第一步从token中取出身份信息 String userCode = (String) token.getPrincipal(); // 第二步:根据用户输入的userCode从数据库查询 // .... // 如果查询不到返回null //数据库中用户账号是zhangsansan /*if(!userCode.equals("zhangsansan")){// return null; }*/ // 模拟从数据库查询到密码 String password = "111111"; // 如果查询到返回认证信息AuthenticationInfo SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo( userCode, password, this.getName()); return simpleAuthenticationInfo; } // 用于授权 @Override protected AuthorizationInfo doGetAuthorizationInfo( PrincipalCollection principals) { //从 principals获取主身份信息 //将getPrimaryPrincipal方法返回值转为真实身份类型(在上边的doGetAuthenticationInfo认证通过填充到SimpleAuthenticationInfo中身份类型), String userCode = (String) principals.getPrimaryPrincipal(); //根据身份信息获取权限信息 //连接数据库... //模拟从数据库获取到数据 List permissions = new ArrayList(); permissions.add("user:create");//用户的创建 permissions.add("items:add");//商品添加权限 //.... //查到权限数据,返回授权信息(要包括 上边的permissions) SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo(); //将上边查询到授权信息填充到simpleAuthorizationInfo对象中 simpleAuthorizationInfo.addStringPermissions(permissions); return simpleAuthorizationInfo; } }

测试

AuthenticationTest.java

// 自定义realm
    @Test
    public void testCustomRealm() {

        // 创建securityManager工厂,通过ini配置文件创建securityManager工厂
        Factory factory = new IniSecurityManagerFactory(
                "classpath:shiro-realm.ini");

        // 创建SecurityManager
        SecurityManager securityManager = factory.getInstance();

        // 将securityManager设置当前的运行环境中
        SecurityUtils.setSecurityManager(securityManager);

        // 从SecurityUtils里边创建一个subject
        Subject subject = SecurityUtils.getSubject();

        // 在认证提交前准备token(令牌)
        // 这里的账号和密码 将来是由用户输入进去
        UsernamePasswordToken token = new UsernamePasswordToken("zhangsan",
                "111111");

        try {
            // 执行认证提交
            subject.login(token);
        } catch (AuthenticationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        // 是否认证通过
        boolean isAuthenticated = subject.isAuthenticated();

        System.out.println("是否认证通过:" + isAuthenticated);

    }

    // 自定义realm实现散列值匹配
    @Test
    public void testCustomRealmMd5() {

        // 创建securityManager工厂,通过ini配置文件创建securityManager工厂
        Factory factory = new IniSecurityManagerFactory(
                "classpath:shiro-realm-md5.ini");

        // 创建SecurityManager
        SecurityManager securityManager = factory.getInstance();

        // 将securityManager设置当前的运行环境中
        SecurityUtils.setSecurityManager(securityManager);

        // 从SecurityUtils里边创建一个subject
        Subject subject = SecurityUtils.getSubject();

        // 在认证提交前准备token(令牌)
        // 这里的账号和密码 将来是由用户输入进去
        UsernamePasswordToken token = new UsernamePasswordToken("zhangsan",
                "222222");

        try {
            // 执行认证提交
            subject.login(token);
        } catch (AuthenticationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        // 是否认证通过
        boolean isAuthenticated = subject.isAuthenticated();

        System.out.println("是否认证通过:" + isAuthenticated);

    }

你可能感兴趣的:(shiro权限框架自定义realm认证测试精讲篇)