- 浏览: 188419 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (321)
- eclipse (4)
- idea (2)
- Html (8)
- Css (14)
- Javascript (8)
- Jquery (6)
- Ajax Json (4)
- Bootstrap (0)
- EasyUI (0)
- Layui (0)
- 数据结构 (0)
- Java (46)
- DesPattern (24)
- Algorithm (2)
- Jdbc (8)
- Jsp servlet (13)
- Struts2 (17)
- Hibernate (11)
- Spring (5)
- S2SH (1)
- SpringMVC (4)
- SpringBoot (11)
- WebService CXF (4)
- Poi (2)
- JFreeChart (0)
- Shiro (6)
- Lucene (5)
- ElasticSearch (0)
- JMS ActiveMQ (3)
- HttpClient (5)
- Activiti (0)
- SpringCloud (11)
- Dubbo (6)
- Docker (0)
- MySQL (27)
- Oracle (18)
- Redis (5)
- Mybatis (11)
- SSM (1)
- CentOS (10)
- Ant (2)
- Maven (4)
- Log4j (7)
- XML (5)
最新评论
1. 权限认证核心要素
2. 授权
2.1 编程式授权
2.1.1 基于角色的访问控制
2.1.2 基于权限的访问控制
2.2 注解式授权
2.3 Jsp标签授权
3. 权限分类
4. 授权流程
权限认证,也就是访问控制,即在应用中控制谁能访问哪些资源。 在权限认证中,最核心的三个要素是:权限,角色和用户。 权限:即操作资源的权利,比如访问某个页面,以及对某个模块的数据的添加,修改,删除,查看的权利; 角色:是权限的集合,一中角色可以包含多种权限; 用户:在Shiro中,代表访问系统的用户,即Subject;
2. 授权
2.1 编程式授权
pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.andrew.shiro</groupId> <artifactId>Shrio03</artifactId> <version>0.0.1-SNAPSHOT</version> <name>Shiro03</name> <description>Shiro03 Project</description> <dependencies> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.2.4</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.12</version> </dependency> <dependency> <groupId>c3p0</groupId> <artifactId>c3p0</artifactId> <version>0.9.1.2</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.37</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </dependencies> </project> src/main/resources/jdbc_realm.ini [main] jdbcRealm=org.apache.shiro.realm.jdbc.JdbcRealm dataSource=com.mchange.v2.c3p0.ComboPooledDataSource dataSource.driverClass=com.mysql.jdbc.Driver dataSource.jdbcUrl=jdbc:mysql://localhost:3306/shiro dataSource.user=root dataSource.password=root jdbcRealm.dataSource=$dataSource securityManager.realms=$jdbcRealm src/main/resources/log4j.properties log4j.rootLogger=INFO, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m %n # General Apache libraries log4j.logger.org.apache=WARN # Spring log4j.logger.org.springframework=WARN # Default Shiro logging log4j.logger.org.apache.shiro=TRACE\ # Disable verbose logging log4j.logger.org.apache.shiro.util.ThreadContext=WARN log4j.logger.org.apache.shiro.cache.ehcache.EhCache=WARN src/main/java/com/andrew/common/ShiroUtil.java package com.andrew.common; 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; import org.apache.shiro.util.Factory; public class ShiroUtil { public static Subject login(String configFile, String userName, String password) { // 读取配置文件,初始化SecurityManager工厂 Factory<SecurityManager> factory = new IniSecurityManagerFactory(configFile); // 获取securityManager实例 SecurityManager securityManager = factory.getInstance(); // 把securityManager实例绑定到SecurityUtils SecurityUtils.setSecurityManager(securityManager); // 得到当前执行的用户 Subject currentUser = SecurityUtils.getSubject(); // 创建token令牌,用户名/密码 UsernamePasswordToken token = new UsernamePasswordToken(userName, password); try { // 身份认证 currentUser.login(token); System.out.println("身份认证成功!"); } catch (AuthenticationException e) { e.printStackTrace(); System.out.println("身份认证失败!"); } return currentUser; } }
2.1.1 基于角色的访问控制
src/main/resources/shiro_role.ini [users] andrew=123456,role1,role2 jack=123,role1 src/main/java/com/andrew/shiro/RoleTest.java package com.andrew.shiro; import java.util.Arrays; import org.apache.shiro.subject.Subject; import org.junit.Test; import com.andrew.common.ShiroUtil; public class RoleTest { @Test public void testHasRole() { Subject andrewUser = ShiroUtil.login("classpath:shiro_role.ini", "andrew", "123456"); System.out.println(andrewUser.hasRole("role1") ? "andrew有role1这个角色" : "andrew没有role1这个角色"); boolean[] results = andrewUser.hasRoles(Arrays.asList("role1", "role2", "role3")); System.out.println(results[0] ? "andrew有role1这个角色" : "andrew没有role1这个角色"); System.out.println(results[1] ? "andrew有role2这个角色" : "andrew没有role2这个角色"); System.out.println(results[2] ? "andrew有role3这个角色" : "andrew没有role3这个角色"); System.out.println(andrewUser.hasAllRoles(Arrays.asList("role1", "role2")) ? "andrew role1,role2这两个角色都有" : "andrew role1,role2这个两个角色不全有"); andrewUser.logout(); Subject jackUser = ShiroUtil.login("classpath:shiro_role.ini", "jack", "123"); System.out.println(jackUser.hasRole("role1") ? "jack有role1这个角色" : "jack没有role1这个角色"); boolean[] results2 = jackUser.hasRoles(Arrays.asList("role1", "role2", "role3")); System.out.println(results2[0] ? "jack有role1这个角色" : "jack没有role1这个角色"); System.out.println(results2[1] ? "jack有role2这个角色" : "jack没有role2这个角色"); System.out.println(results2[2] ? "jack有role3这个角色" : "jack没有role3这个角色"); System.out.println(jackUser.hasAllRoles(Arrays.asList("role1", "role2")) ? "jack role1,role2这两个角色都有" : "jack role1,role2这个两个角色不全有"); jackUser.logout(); } @Test public void testCheckRole() { Subject andrewUser = ShiroUtil.login("classpath:shiro_role.ini", "andrew", "123456"); andrewUser.checkRole("role1"); andrewUser.checkRoles(Arrays.asList("role1","role2")); andrewUser.checkRoles("role1","role2","role3"); andrewUser.logout(); Subject jackUser = ShiroUtil.login("classpath:shiro_role.ini", "jack", "123"); jackUser.checkRole("role1"); jackUser.checkRoles(Arrays.asList("role1","role2")); jackUser.checkRoles("role1","role2","role3"); jackUser.logout(); } } 运行结果: 身份认证成功! andrew有role1这个角色 andrew有role1这个角色 andrew有role2这个角色 andrew没有role3这个角色 andrew role1,role2这两个角色都有 身份认证成功! jack有role1这个角色 jack有role1这个角色 jack没有role2这个角色 jack没有role3这个角色 jack role1,role2这个两个角色不全有
2.1.2 基于权限的访问控制
src/main/resources/shiro_permission.ini [users] andrew=123456,role1,role2 jack=123,role1 [roles] role1=user:select role2=user:add,user:update,user:delete src/main/java/com/andrew/shiro/PermissionTest.java package com.andrew.shiro; import org.apache.shiro.subject.Subject; import org.junit.Test; import com.andrew.common.ShiroUtil; public class PermissionTest { @Test public void testIsPermitted() { Subject andrewUser = ShiroUtil.login("classpath:shiro_permission.ini", "andrew", "123456"); System.out.println(andrewUser.isPermitted("user:select") ? "andrew有user:select这个权限" : "andrew没有user:select这个权限"); System.out.println(andrewUser.isPermitted("user:update") ? "andrew有user:update这个权限" : "andrew没有user:update这个权限"); boolean results[] = andrewUser.isPermitted("user:select", "user:update", "user:delete"); System.out.println(results[0] ? "andrew有user:select这个权限" : "andrew没有user:select这个权限"); System.out.println(results[1] ? "andrew有user:update这个权限" : "andrew没有user:update这个权限"); System.out.println(results[2] ? "andrew有user:delete这个权限" : "andrew没有user:delete这个权限"); System.out.println(andrewUser.isPermittedAll("user:select", "user:update") ? "andrew有user:select,update这两个权限" : "andrew user:select,update这两个权限不全有"); andrewUser.logout(); Subject jackUser = ShiroUtil.login("classpath:shiro_permission.ini", "jack", "123"); System.out.println(jackUser.isPermitted("user:select") ? "jack有user:select这个权限" : "jack没有user:select这个权限"); System.out.println(jackUser.isPermitted("user:update") ? "jack有user:update这个权限" : "jack没有user:update这个权限"); boolean results2[] = jackUser.isPermitted("user:select", "user:update", "user:delete"); System.out.println(results2[0] ? "jack有user:select这个权限" : "jack没有user:select这个权限"); System.out.println(results2[1] ? "jack有user:update这个权限" : "jack没有user:update这个权限"); System.out.println(results2[2] ? "jack有user:delete这个权限" : "jack没有user:delete这个权限"); System.out.println(jackUser.isPermittedAll("user:select", "user:update") ? "jack有user:select,update这两个权限" : "jack user:select,update这两个权限不全有"); jackUser.logout(); } @Test public void testCheckPermitted() { Subject andrewUser = ShiroUtil.login("classpath:shiro_permission.ini", "andrew", "123456"); andrewUser.checkPermission("user:select"); andrewUser.checkPermissions("user:select", "user:update", "user:delete"); andrewUser.logout(); Subject jackUser = ShiroUtil.login("classpath:shiro_permission.ini", "jack", "123"); jackUser.checkPermission("user:select"); jackUser.checkPermissions("user:select", "user:update", "user:delete"); jackUser.logout(); } } 运行结果: 身份认证成功! andrew有user:select这个权限 andrew有user:update这个权限 andrew有user:select这个权限 andrew有user:update这个权限 andrew有user:delete这个权限 andrew有user:select,update这两个权限 身份认证成功! jack有user:select这个权限 jack没有user:update这个权限 jack有user:select这个权限 jack没有user:update这个权限 jack没有user:delete这个权限 jack user:select,update这两个权限不全有
2.2 注解式授权
@RequiresAuthentication要求当前Subject已经在当前的session中被验证通过才能被访问或调用。 @RequiresGuest要求当前的Subject是一个"guest",也就是说,他们必须是在之前的session中没有被验证或被记住才能被访问或调用。 @RequiresPermissions("account:create")要求当前的Subject被允许一个或多个权限,以便执行注解的方法。 @RequiresRoles("administrator")要求当前的Subject拥有所有指定的角色。如果他们没有,则该方法将不会被执行,而且AuthorizationException异常将会被抛出。 @RequiresUserRequiresUser注解需要当前的Subject是一个应用程序用户才能被注解的类/实例/方法访问或调用。一个"应用程序用户"被定义为一个拥有已知身份,或在当前session中由于通过验证被确认,或者在之前session中的'RememberMe'服务被记住。
2.3 Jsp标签授权
<%@taglib prefix="shiro" uri="http://shiro.apache.org/tags"%> Guest标签:用户没有身份验证时显示相应信息,即游客访问信息; User标签:用户已经身份验证/记住我登录后显示相应的信息; Authenticated标签:用户已经身份验证通过,即Subject.login登录成功,不是记住我登录的。 notAuthenticated标签:用户没有身份验证通过,即没有调用Subject.login进行登录,包括记住我自动登录的也属于未进行身份验证。 principal标签显示用户身份信息,默认调用Subject.getPrincipal()获取,即Primary Principal。 hasRole标签如果当前Subject有角色将显示body体内容。 lacksRole标签如果当前Subject没有角色将显示body体内容。 hasAnyRoles标签如果当前Subject有任意一个角色(或的关系)将显示body体内容。 hasPermission标签如果当前Subject有权限将显示body体内容。 lacksPermission标签如果当前Subject没有权限将显示body体内容。
3. 权限分类
单个权限 query 单个资源多个权限 user:query user:add 多值 user:query,add 单个资源所有权限 user:query,add,update,delete user:* 所有资源某个权限 *:view 实例级别的权限控制 单个实例的单个权限 printer:query:lp7200 printer:print:epsoncolor 所有实例的单个权限 printer:print:* 所有实例的所有权限 printer:*:* 单个实例的所有权限 printer:*:lp7200 单个实例的多个权限 printer:query,print:lp7200
4. 授权流程
发表评论
-
Shiro整合Spring
2019-02-20 09:20 3361. Shiro加密 文档:http://shiro.a ... -
Shiro自定义Realm
2019-02-19 09:17 3901. Shiro自定义Realm create mave ... -
Shiro集成web
2019-02-18 09:51 3951. Shiro集成Web配置 <!-- 添加sh ... -
Shiro身份认证
2019-02-18 09:31 2951. Subject认证主体 Subject认证主体包含 ... -
Shiro简介与示例
2019-02-18 09:23 3201. Shiro简介 Shiro官方主页:http://sh ...
相关推荐
Spring Boot 和 Apache Shiro 的整合是企业级应用中常见的权限认证和安全管理方案。Spring Boot 提供了简化 Java 应用程序开发的框架,而 Shiro 是一个轻量级的安全框架,专注于身份验证、授权、会话管理和加密。...
在这个"Shiro 权限认证以及授权demo"中,我们将深入理解Shiro的核心概念,并通过实际操作来熟悉其使用。 **1. 认证(Authentication)** Shiro的认证过程涉及用户提交凭证(如用户名/密码)到系统,Shiro验证这些...
在本文中,我们将深入探讨Shiro的核心概念,包括权限认证和授权,以及如何在实际项目中有效应用。 ### 一、Shiro认证 **1. 用户身份验证(Authentication)** 用户身份验证是验证用户身份的过程,确保用户是他们...
本demo 采用的shirodemo 演变而来(第3个连接): 1、其中添加了与数据库交互,数据分布设置的是用户-权限-资源 2、添加了验证码验证 3、纠正了无权限跳转BUG ...5、由shirodemo硬编码转换成注解控制授权
这个"shiro认证及授权demo"应该包含了设置Shiro环境、配置 Realm、创建 SecurityManager、定义用户角色和权限以及处理登录、登出等核心功能的示例代码。 1. **Shiro环境设置**:首先,需要在项目中引入Shiro的依赖...
本项目为Java语言编写,采用SpringBoot框架,成功整合了Shiro权限认证与授权机制,旨在实现高效的权限认定和授权管理。项目包含22个文件,涵盖9个Java源文件、5个HTML文件、2个属性文件、1个Git忽略文件、1个JAR包...
在这个"shiro权限案例demo"中,我们将深入探讨Shiro如何实现用户权限的管理。 首先,让我们了解Shiro的核心组件: 1. **Subject**:是Shiro的中心概念,代表了当前“安全的用户”。它提供了进行认证、授权、会话...
Apache Shiro 是一个强大且易用的 Java 安全框架,提供了认证、授权、加密和会话管理功能,可以非常方便地开发出足够安全的应用。本文将深入探讨 Shiro 的核心概念,包括认证和授权,并结合提供的 `shiro-demo` 代码...
在这个项目中,我们将探讨如何实现 Shiro 认证授权的基本过程,以及与数据库的交互。 首先,Shiro 的认证过程涉及用户提交身份验证信息(如用户名和密码)到系统。系统随后会通过认证器(Realm)验证这些信息。在本...
总结,Apache Shiro 的认证授权过程涉及到多个组件的协同工作,从用户输入的凭证验证到权限的控制,每个环节都设计得相当灵活,可以适应各种复杂的安全需求。通过源码分析和实际应用,我们可以更好地理解和利用Shiro...
shiro+redis作为认证授权服务 oaa,提供为网关feign接口,用来验证权限 。 方案二: zuul作为网关,具备熔断,负载,统一操作日志。整合shiro+redis为网关进行认证权限拦截,过滤器统一异常捕获 ; 两种网关底层实现...
开箱即用的微服务认证授权框架 基本功能: ...3.shiro+redis作为认证授权服务 oaa,提供为网关feign接口,用来验证权限 。 注意: 1.nacos1.1.4的安装包和naocs的配置文件也在压缩包内; 2.项目中有建表sql;
通过以上步骤,我们可以实现一个基于Shiro的Spring Boot应用,实现登录授权认证功能,确保只有经过身份验证并拥有相应权限的用户才能访问特定的资源。同时,Shiro的灵活性使得它可以轻松适应各种复杂的安全需求。
一旦用户通过CAS认证,Shiro可以通过Realm获取用户的角色和权限信息,进行授权判断。 5. **单点登出(Single Logout, SLO)**:当用户在任一应用中登出时,通过CAS的SLO特性,可以确保用户在所有关联的应用中同时...
shiro 认证授权框架详解 Shiro 认证授权框架是 Java 中一种流行的认证授权解决方案,提供了完整的认证和授权机制,能够满足大多数应用程序的安全需求。Shiro 框架的核心思想是将认证和授权分离,认证负责验证用户...
本案例将深入探讨Shiro如何实现用户登录认证和权限授权。 **一、Shiro认证流程** Shiro的认证过程主要涉及以下几个步骤: 1. **凭证匹配器(CredentialsMatcher)**:这是Shiro用来比对用户输入的凭证(如密码)...
Apache Shiro 是一个强大且易用的 Java 安全框架,提供身份认证、授权、加密和会话管理功能,可以非常容易地开发出足够安全的应用。在遇到“Shiro 不执行授权方法 `doGetAuthorizationInfo()`”的问题时,通常表明在...
在这个“shiro权限管理案例加文档”中,我们很可能会找到关于如何在实际项目中应用Shiro进行权限控制的详细教程和实例。 **一、Shiro基础** Shiro的核心组件包括:Subject(主体)、Realms(域)、Cryptography...
Apache Shiro 是一个强大且易用的 Java ...通过以上步骤,我们就完成了 Shiro 中的角色与权限认证流程。这个示例代码可以帮助你理解如何在实际项目中运用 Shiro 实现用户身份验证和权限控制,确保应用程序的安全性。
这个"java shiro权限认证demo"应该是展示如何在Java项目中使用Shiro进行用户权限验证的一个实例。下面,我们将深入探讨Shiro的核心概念以及如何在实践中应用它们。 1. **Shiro基础概念** - **身份验证...