【三】shiro入门 之 Realm

Realm:域,Shiro 从从Realm获取安全数据(如用户、角色、权限),就是说SecurityManager要验证用户身份,那么它需要从Realm获取相应的用户进行比较以确定用户身份是否合法;
也需要从Realm得到用户相应的角色/权限进行验证用户是否能进行操作;可以把Realm看成DataSource , 即安全数据源。

Realm接口如下

String getName(); //返回一个唯一的Realm名字
boolean supports(AuthenticationToken token); //判断此Realm是否支持此Token
AuthenticationInfo getAuthenticationInfo(AuthenticationToken token)
throws AuthenticationException; //根据Token获取认证信息

单Realm配置

1.自定义Realm实现

package me.shijunjie.realms;

import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.realm.Realm;

public class MyRealm1 implements Realm {

    public String getName() {
        return "MyRealm1";
    }

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

    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());
    }

}

2、ini配置文件指定自定义Realm实现(shiro-realm.ini)

#声明一个realm
myRealm1=me.shijunjie.realms.MyRealm1
#指定securityManager的realms实现
securityManager.realms=$myRealm1

3.测试示例

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

        try {
        //4、登录,即身份验证
        subject.login(token);
        } catch (AuthenticationException e) {
          //5、身份验证失败
            System.out.println("身份验证失败");
        }

        //断言用户已经登录
        Assert.assertEquals(true, subject.isAuthenticated());

        subject.logout();
    }

多 Realm配置

1、ini配置文件(shiro-multi-realm.ini)

#声明一个realm
myRealm1=com.github.zhangkaitao.shiro.chapter2.realm.MyRealm1
myRealm2=com.github.zhangkaitao.shiro.chapter2.realm.MyRealm2
#指定securityManager的realms实现
securityManager.realms=$myRealm1,$myRealm2

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

时间: 2024-11-05 22:48:10

【三】shiro入门 之 Realm的相关文章

JAVAWEB开发之权限管理(二)——shiro入门详解以及使用方法、shiro认证与shiro授权

shiro介绍 什么是shiro shiro是Apache的一个开源框架,它将软件系统的安全认证相关的功能抽取出来,实现用户身份认证,权限授权.加密.会话管理等功能,组成了一个通用的安全认证框架.它可以实现如下的功能: 1.验证用户 2.对用户执行访问控制,如:判断用户是否具有角色admin,判断用户是否拥有访问的资源权限. 3.在任何环境下使用SessionAPI.例如C/S程序 4.可以使用多个用户数据源.例如一个是Oracle数据库,另外一个是MySQL数据库. 5.单点登录(SSO)功能

【转】Apache shiro集群实现 (一) shiro入门介绍

近期在ITOO项目中研究使用Apache shiro集群中要解决的两个问题,一个是Session的共享问题,一个是授权信息的cache共享问题,官网上给的例子是Ehcache的实现,在配置说明上不算很详细,我在我们的项目中使用的是nosql(Redis)替代了ehcache做了session和cache的存储,接下来从shiro.Cas.redis.session等等基础知识.基本原理集成的角度来不断的深入分析,系列文章篇幅很长,很丰富,尽请期待! Apache shiro集群实现 (一) sh

shiro入门应用示例(采用spring+springmvc+mybatis+shiro)

原文:shiro入门应用示例(采用spring+springmvc+mybatis+shiro) 源代码下载地址:http://www.zuidaima.com/share/1550463711726592.htm shiro入门应用示例供参考(采用spring+springmvc+mybatis+shiro) 项目完整源码 链接: http://pan.baidu.com/s/1uyc7I 密码:qk0j

shiro基础学习(三)&mdash;shiro授权

一.入门程序 1.授权流程        2.授权的三种方式 (1)编程式: 通过写if/else 授权代码块完成. Subject subject = SecurityUtils.getSubject(); if(subject.hasRole("admin")) {      //有权限 } else {      //无权限 } (2)注解式: 通过在执行的Java方法上放置相应的注解完成. @RequiresRoles("admin") public voi

SSM(三)Shiro使用详解

前言 相比有做过企业级开发的童鞋应该都有做过权限安全之类的功能吧,最先开始我采用的是建用户表,角色表,权限表,之后在拦截器中对每一个请求进行拦截,再到数据库中进行查询看当前用户是否有该权限,这样的设计能满足大多数中小型系统的需求.不过这篇所介绍的Shiro能满足之前的所有需求,并且使用简单,安全性高,而且现在越来越的多企业都在使用Shiro,这应该是一个收入的你的技能库. 创建自定义MyRealm类 有关Shiro的基础知识我这里就不过多介绍了,直接来干货,到最后会整合Spring来进行权限验证

Shiro Review——自定义Realm实现认证

一,自定义Realm 在之前,使用过下面的ini文件进行认证测试: #对用户信息进行配置 [users] #用户名跟密码 zhangsan=111111 lisi=111111 里面用户的认证信息是写死的,so,now ,来测试下使用自定义Realm来从我们的DB读取User信息,完成用户认证. 首先大致看下Realm的类层级关系: 比如,我们之前使用ini文件中的users配置用户名跟密码的时候,认证和时候使用的Realm就是IniRealm,比如里面的JdbcRealm,我们可以在数据库里面

Apache shiro集群实现 (一) shiro入门介绍

近期在ITOO项目中研究使用Apache shiro集群中要解决的两个问题,一个是Session的共享问题,一个是授权信息的cache共享问题,官网上给的例子是Ehcache的实现,在配置说明上不算很详细,我在我们的项目中使用的是nosql(Redis)替代了ehcache做了session和cache的存储,接下来从shiro.Cas.redis.session等等基础知识.基本原理集成的角度来不断的深入分析,系列文章篇幅很长,很丰富,尽请期待! 今天我们先来介绍shiro的基本概念 一.sh

shiro权限认证Realm的四大用法

一.SimpleAccountRealm public class AuthenticationTest { SimpleAccountRealm sar=new SimpleAccountRealm(); @Before public void addUser() { sar.addAccount("mark", "123456","admin","user"); } @Test public void testAuthen

Shiro 入门

Apache Shiro(http://shiro.apache.org/) 是 Java 的一个安全(权限)框架. Shiro 可以非常容易的开发出足够好的应用,其不仅可以用在 JavaSE 环境,也可以用在 JavaEE 环境. Shiro 可以完成:认证.授权.加密.会话管理.与Web 集成.缓存等. 主要类介绍 Authentication:身份认证/登录,验证用户是不是拥有相应的身份:1. Authorization:授权,即权限验证,验证某个已认证的用户是否拥有某个权限:即判断用户是