一、入门程序

1.授权流程

    

 

2.授权的三种方式

(1)编程式: 通过写if/else 授权代码块完成。

Subject subject = SecurityUtils.getSubject();

if(subject.hasRole("admin")) {

     //有权限

} else {

     //无权限

}

(2)注解式: 通过在执行的Java方法上放置相应的注解完成。

@RequiresRoles("admin")

public void hello() {

     //有权限

}

(3)JSP/GSP 标签: 在JSP/GSP 页面通过相应的标签完成。

<shiro:hasRole name="admin">

     <!— 有权限—>

</shiro:hasRole>

 

3.ini文件

shiro-permission.ini

     在ini文件中用户、角色、权限的配置规则是:“用户名=密码,角色1,角色2...” “角色=权限1,权限2...”,首先根据用户名找角色,再根据角色找权限,角色是权限集合。

     权限字符串的规则是:“资源标识符:操作:资源实例标识符”,意思是对哪个资源的哪个实例具有什么操作,“:”是资源/操作/实例的分割符,权限字符串也可以使用*通配符。

例子:

用户创建权限: user:create,或user:create:*

用户修改实例001的权限: user:update:001

用户实例001的所有权限: user:*:001

 

4.测试代码

/*
* 授权的测试
*/
public class AuthorzationTest{ //角色授权、资源授权测试 @Test
public void testAuthorzation(){
//创建SecurityManager工厂
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro-permission.ini"); //创建SecurityManager
SecurityManager securityManager = factory.getInstance(); //将SecurityManager设置到系统环境
SecurityUtils.setSecurityManager(securityManager); //创建Subject
Subject subject = SecurityUtils.getSubject(); //创建token令牌
UsernamePasswordToken token = new UsernamePasswordToken("zhangsan","123"); //执行认证
try{
subject.login(token);
}catch(AuthenticationException e){
e.printStackTrace();
} System.out.println("是否认认证通过: " + subject.isAuthenticated()); //基于角色的授权(角色标识)
boolean hasRole = subject.hasRole("role3");
System.out.println("基于角色的授权: " + hasRole); //基于资源的授权(权限标识符)
boolean permitted = subject.isPermitted("user:create");
System.out.println("基于资源的授权: " + permitted);
} }

结果:

       是否认认证通过: true

       基于角色的授权: false

       基于资源的授权: true

 

二、自定义Realm

1.shiro-realm.ini

     在shiro-realm.ini中配置自定义的realm,将realm设置到securityManager中。

    

 

2.实现代码

/*
* 自定义Realm
*/
public class CustomRealm extends AuthorizingRealm{ //设置Realm名称
@Override
public void setName(String name){
super.setName("customRealm");
} //用于认证
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException{ //1.从token取出用户身份信息
String userCode = (String)token.getPrincipal(); //2.根据用户userCode查询数据库
//模拟从数据库查询到的密码
String password = "123"; //3.查询到返回认证信息
SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(userCode,password,this.getName()); return info;
} //用于授权
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals){ //获取主身份信息
String userCode = (String)principals.getPrimaryPrincipal(); //根据身份信息获取权限信息
//模拟从数据库获取到数据
List<String> permissions = new ArrayList<String>();
permissions.add("user:create"); //用户的创建权限
permissions.add("items:add"); //商品的添加权限 //将查询到授权信息填充到对象中
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
info.addStringPermissions(permissions); return info;
}
}

 

3.测试代码

	@Test
public void testCusRealm(){
//创建SecurityManager工厂
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro-realm.ini"); //创建SecurityManager
SecurityManager securityManager = factory.getInstance(); //将SecurityManager设置到系统环境
SecurityUtils.setSecurityManager(securityManager); //创建Subject
Subject subject = SecurityUtils.getSubject(); //创建token令牌
UsernamePasswordToken token = new UsernamePasswordToken("zhangsan","123"); //执行认证
try{
subject.login(token);
}catch(AuthenticationException e){
e.printStackTrace();
} System.out.println("是否认认证通过: " + subject.isAuthenticated()); //基于资源的授权(权限标识符)
boolean permitted = subject.isPermitted("user:create");
System.out.println("基于资源的授权: " + permitted);
}

shiro基础学习(三)—shiro授权的更多相关文章

  1. shiro基础学习(四)—shiro与项目整合

    一.认证 1.配置web.xml   2.配置applicationContext.xml      在applicationContext.xml中配置一个bean,ID和上面的过滤器的名称一致. ...

  2. shiro基础学习(二)—shiro认证

    一.shiro简介      shiro是apache旗下一个开源框架,它将软件系统的安全认证相关的功能抽取出来,实现用户身份认证.权限授权.加密.会话管理等功能,组成了一个通用的安全认证框架. 以下 ...

  3. Shiro:学习笔记(2)——授权

    Shiro:学习笔记(2)——授权 Shiro的三种授权方式 编程式: Subject subject = SecurityUtils.getSubject(); if(subject.hasRole ...

  4. Shiro笔记(三)授权

    Shiro笔记(三)授权 一.授权方式 1.编程式: Subject subject=SecurityUtils.getSubject(); if(subject.hasRole("root ...

  5. Python入门基础学习 三

    Python入门基础学习 三 数据类型 Python区分整型和浮点型依靠的是小数点,有小数点就是浮点型. e记法:e就是10的意思,是一种科学的计数法,15000=1.5e4 布尔类型是一种特殊的整形 ...

  6. Python基础学习三

    Python基础学习三 1.列表与元组 len()函数:可以获取列表的元素个数. append()函数:用于在列表的最后添加元素. sort()函数:用于排序元素 insert()函数:用于在指定位置 ...

  7. Django基础学习三_路由系统

    今天主要来学习一下Django的路由系统,视频中只学了一些皮毛,但是也做下总结,主要分为静态路由.动态路由.二级路由 一.先来看下静态路由 1.需要在project中的urls文件中做配置,然后将匹配 ...

  8. Shiro基础学习(一)—权限管理

    一.基本概念 1.权限管理      只要有用户参与的系统一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源.     权限管理 ...

  9. Java基础学习(三)—面向对象(上)

    一.理解面向对象       面向对象是一种思想,是基于面向过程而言的,就是说面向对象是将功能等通过对象来实现,将功能封装进对象之中,让对象去实现具体的细节:这种思想是将数据作为第一位,而方法或者说是 ...

随机推荐

  1. 阿里云LINUX服务器配置HTTPS(NGINX)

    本文首发于:http://www.fengzheng.pub/archives/238.html 背景说明 服务器为阿里云 ECS,操作系统为 CentOS 6.5. 部署配置说明 第一步,安装ngi ...

  2. 基于php(Thinkphp)+jquery 实现ajax多选,反选,不选 删除数据 新手学习向

    jquery多选源码来源素材火http://www.sucaihuo.com/ (有什么问题可以私本人邮箱1428937236@qq.com,也可加qq来时表明来意即可) 建议有js基础,了解jque ...

  3. MINA、Netty、Twisted一起学(十二):HTTPS

    由于HTTPS协议是由HTTP协议加上SSL/TLS协议组合而成,在阅读本文前可以先阅读一下HTTP服务器和SSL/TLS两篇博文,本文中的代码也是由这两篇博文中的代码组合而成. HTTPS介绍 上一 ...

  4. linux数据库初始化配置

    mysql: 第一次登陆mysql -uroot -p,密码输入直接回车,以空密码登陆 选择数据库:use mysql; UPDATE user SET password=PASSWORD('Java ...

  5. BI数据分析中KPI,KGI,CSF概念

    1. 行为产生数据 先来谈一谈,自己对数据基础概念的思考.我认为首先要建立的核心观点是:行为产生数据. 翻译一下这个核心观点.意思就是,当我们在思考或描述数据相关需求的时候,必然要包含这样的语素:&q ...

  6. lxd容器之GPU发现和加载

    lxd gpu设备发现: // /dev/nvidia[0-9]+ type nvidiaGpuCards struct { path string major int minor int id st ...

  7. 使用wsimport生成不带JAXBElement对象的代理

    如果想使用wsimport生成不带JAXBElement对象的代理,则可以使用jaxws/jaxb绑定文件,如文件命名为binding.txt,内容如 <jaxb:bindings versio ...

  8. jquery与js的区别与基础操作

    一.什么是 jQuery jQuery是一个JavaScript库,它通过封装原生的JavaScript函数得到一整套定义好的方法.它的作者是John Resig,于2006年创建的一个开源项目,随着 ...

  9. html基础知识1(基本标签)2017-03-07

    摘要:php基础知识1 内容:大学中虽有接触,却是以学生的心态去应付考试的,学的都是理论知识:从今天开始我同样还是要以学生的心态去学习,但却要以要从事工作的心态去练习. 以下为第一天所学内容,因电脑原 ...

  10. Servlet中过滤器的执行流程