自定义 Relam

Posted KoKo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自定义 Relam相关的知识,希望对你有一定的参考价值。

package org.zln.hello.realm;

import org.apache.shiro.authc.*;
import org.apache.shiro.realm.Realm;

/**
 * Created by sherry on 16/9/8.
 */
public class MyRealm01 implements Realm {
    @Override
    public String getName() {
        return "MyRealm01";
    }

    @Override
    public boolean supports(AuthenticationToken token) {
        //仅支持UsernamePasswordToken类型的 Token
        return token instanceof UsernamePasswordToken;
    }

    @Override
    public AuthenticationInfo getAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        String username = (String)token.getPrincipal(); //得到用户名
        String password = new String((char[])token.getCredentials()); //得到密码
        if(!"zhang".equals(username)) {
            throw new UnknownAccountException(); //如果用户名错误
            //
        }
        if(!"123".equals(password)) {
            throw new IncorrectCredentialsException(); //如果密码错误
        }
        //如果身份认证验证成功,返回一个 AuthenticationInfo 实现;

        return new SimpleAuthenticationInfo(username, password, getName());
    }
}
#声明一个 realm
MyRealm01=org.zln.hello.realm.MyRealm01
#指定 securityManager 的 realms 实现
securityManager.realms=$MyRealm01
package org.zln.hello;

import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.util.Factory;

/**
 * Created by sherry on 16/9/8.
 */
public class HelloWorld {

    private static Logger logger = LogManager.getLogger(HelloWorld.class);

    private static Subject subject;

    static {
        //1、获取 SecurityManager 工厂,此处使用 Ini 配置文件初始化 SecurityManager
//        Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
        Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro-realm.ini");
        //2、得到 SecurityManager 实例 并绑定给 SecurityUtils
        SecurityManager securityManager = factory.getInstance();
        SecurityUtils.setSecurityManager(securityManager);
        //3、得到 Subject 及创建用户名/密码身份验证 Token(即用户身份/凭证)
        subject = SecurityUtils.getSubject();
    }

    public static boolean login(String username,String password){
        UsernamePasswordToken token = new UsernamePasswordToken(username,password);
        //4、登录,即身份验证
        try {
            subject.login(token);
        }catch (Exception e){
            logger.info("身份验证失败");
            logger.error(e.getMessage(),e);
            return false;
        }

        return subject.isAuthenticated();//是否成功登陆

    }

    public static void main(String[] args) {

        //6、退出
        subject.logout();
    }
}

 

 

多 Realm 配置 

#声明一个 realm

myRealm1=com.github.zhangkaitao.shiro.chapter2.realm.MyRealm1

myRealm2=com.github.zhangkaitao.shiro.chapter2.realm.MyRealm2

#指定 securityManager 的 realms 实现

securityManager.realms=$myRealm1,$myRealm2 

 

 

securityManager 会按照 realms 指定的顺序进行身份认证。此处我们使用显示指定顺序的方 式指定了 Realm 的顺序,如果删除“securityManager.realms=$myRealm1,$myRealm2”,那 么 securityManager 会按照 realm 声明的顺序进行使用(即无需设置 realms 属性,其会自动 发现),当我们显示指定 realm 后,其他没有指定 realm 将被忽略,如 “securityManager.realms=$myRealm1”,那么 myRealm2 不会被自动设置进去。 

 

以上是关于自定义 Relam的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段6——CSS选择器

VSCode自定义代码片段(vue主模板)

VSCode自定义代码片段——声明函数

VSCode自定义代码片段——.vue文件的模板

VSCode自定义代码片段——git命令操作一个完整流程

VSCode自定义代码片段8——声明函数