A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

本帖最后由 Mylo 于 2018-5-16 14:42 编辑

Shiro使用自定义Realm
本案例使用maven去实验,以下是maven所需的坐标
<dependencies>
  <dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.1.3</version>
  </dependency>
  <dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-all</artifactId>
    <version>1.3.2</version>
  </dependency>
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
  </dependency>
</dependencies>

对应的shiro.ini(放在src下面),使用账号为test,密码是test
[users]
test=test
[main]
userRealm=test.mylo.UserRealm
securityManager.realms=$userRealm

案例:
TestShiro
package test.mylo;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.subject.Subject;

public class TestShiro {
    public static void main(String[] args) {
        //加载配置文件IniSecurityManagerFactory ini = new IniSecurityManagerFactory("classpath:shiro.ini");
        //获取securityManagers实例对象SecurityManager securityManager = ini.getInstance();
        //获取 SecurityManager 并绑定到 SecurityUtilsSecurityUtils.setSecurityManager(securityManager);
        //获取当前主体对象Subject subject = SecurityUtils.getSubject();
        //设置当前的TOKENUsernamePasswordToken token = new UsernamePasswordToken("test", "test");
        try {
            System.out.println(1);
            subject.login(token);
            System.out.println("验证成功");
        } catch (AuthenticationException e) {
            //验证失败e.printStackTrace();
            System.out.println("验证失败");
        }
    }
}

自定义Realm
Realm:域,Shiro 从从 Realm 获取安全数据(如用户、角色、权限),就是说 SecurityManager 要验证用户身份,那么它需要从 Realm 获取相应的用户进行比较以确定用户身份是否合法;也需要从 Realm 得到用户相应的角色 / 权限进行验证用户是否能进行操作;可以把 Realm 看成 DataSource,即安全数据源。如我们之前的 ini 配置方式将使用 org.apache.shiro.realm.text.IniRealm。
package test.mylo;

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

public class UserRealm  implements Realm{
    @Override
//返回一个唯一的Realm名字
    public String getName() {
        return "userRealm";
    }

    @Override
//判断此Realm是否支持此Token
    public boolean supports(AuthenticationToken token) {
        return token instanceof UsernamePasswordToken;

    }
//根据Token获取认证信息
    @Override
    public AuthenticationInfo getAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {

        String username = (String)token.getPrincipal();
        String password =  new String((char[])token.getCredentials());
        if("test".equals(username)){
            if("test".equals(password)){
                    return new SimpleAuthenticationInfo(username,password,getName());
            }else {
                //用户密码错误throw new IncorrectCredentialsException();
            }
        }else {
            //用户账号错误throw new UnknownAccountException();
        }

    }
}


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马