`

Shiro权限认证(授权)

阅读更多
1. 权限认证核心要素

权限认证,也就是访问控制,即在应用中控制谁能访问哪些资源。
在权限认证中,最核心的三个要素是:权限,角色和用户。
权限:即操作资源的权利,比如访问某个页面,以及对某个模块的数据的添加,修改,删除,查看的权利;
角色:是权限的集合,一中角色可以包含多种权限;
用户:在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. 授权流程


  • 大小: 164.5 KB
分享到:
评论

相关推荐

    spring boot+shiro 权限认证管理案例

    Spring Boot 和 Apache Shiro 的整合是企业级应用中常见的权限认证和安全管理方案。Spring Boot 提供了简化 Java 应用程序开发的框架,而 Shiro 是一个轻量级的安全框架,专注于身份验证、授权、会话管理和加密。...

    shiro 权限认证以及授权demo

    在这个"Shiro 权限认证以及授权demo"中,我们将深入理解Shiro的核心概念,并通过实际操作来熟悉其使用。 **1. 认证(Authentication)** Shiro的认证过程涉及用户提交凭证(如用户名/密码)到系统,Shiro验证这些...

    shiro权限认证和授权

    在本文中,我们将深入探讨Shiro的核心概念,包括权限认证和授权,以及如何在实际项目中有效应用。 ### 一、Shiro认证 **1. 用户身份验证(Authentication)** 用户身份验证是验证用户身份的过程,确保用户是他们...

    springMVC shiro 认证-授权 结合示例

    本demo 采用的shirodemo 演变而来(第3个连接): 1、其中添加了与数据库交互,数据分布设置的是用户-权限-资源 2、添加了验证码验证 3、纠正了无权限跳转BUG ...5、由shirodemo硬编码转换成注解控制授权

    shiro认证及授权demo

    这个"shiro认证及授权demo"应该包含了设置Shiro环境、配置 Realm、创建 SecurityManager、定义用户角色和权限以及处理登录、登出等核心功能的示例代码。 1. **Shiro环境设置**:首先,需要在项目中引入Shiro的依赖...

    基于Java和SpringBoot的Shiro权限认证与授权整合实践源码

    本项目为Java语言编写,采用SpringBoot框架,成功整合了Shiro权限认证与授权机制,旨在实现高效的权限认定和授权管理。项目包含22个文件,涵盖9个Java源文件、5个HTML文件、2个属性文件、1个Git忽略文件、1个JAR包...

    shiro权限案例demo

    在这个"shiro权限案例demo"中,我们将深入探讨Shiro如何实现用户权限的管理。 首先,让我们了解Shiro的核心组件: 1. **Subject**:是Shiro的中心概念,代表了当前“安全的用户”。它提供了进行认证、授权、会话...

    shiro认证授权

    Apache Shiro 是一个强大且易用的 Java 安全框架,提供了认证、授权、加密和会话管理功能,可以非常方便地开发出足够安全的应用。本文将深入探讨 Shiro 的核心概念,包括认证和授权,并结合提供的 `shiro-demo` 代码...

    Shiro认证授权的基本实现

    在这个项目中,我们将探讨如何实现 Shiro 认证授权的基本过程,以及与数据库的交互。 首先,Shiro 的认证过程涉及用户提交身份验证信息(如用户名和密码)到系统。系统随后会通过认证器(Realm)验证这些信息。在本...

    shiro认证授权的过程

    总结,Apache Shiro 的认证授权过程涉及到多个组件的协同工作,从用户输入的凭证验证到权限的控制,每个环节都设计得相当灵活,可以适应各种复杂的安全需求。通过源码分析和实际应用,我们可以更好地理解和利用Shiro...

    ims_cloud_gateway+shiro完成认证权限、日志等-Euraka版.rar

    shiro+redis作为认证授权服务 oaa,提供为网关feign接口,用来验证权限 。 方案二: zuul作为网关,具备熔断,负载,统一操作日志。整合shiro+redis为网关进行认证权限拦截,过滤器统一异常捕获 ; 两种网关底层实现...

    ims_nacos_gateway+shiro完成认证权限、日志等-Nacos版.rar

    开箱即用的微服务认证授权框架 基本功能: ...3.shiro+redis作为认证授权服务 oaa,提供为网关feign接口,用来验证权限 。 注意: 1.nacos1.1.4的安装包和naocs的配置文件也在压缩包内; 2.项目中有建表sql;

    Shiro登录授权认证功能

    通过以上步骤,我们可以实现一个基于Shiro的Spring Boot应用,实现登录授权认证功能,确保只有经过身份验证并拥有相应权限的用户才能访问特定的资源。同时,Shiro的灵活性使得它可以轻松适应各种复杂的安全需求。

    CAS+Shiro实现认证授权

    一旦用户通过CAS认证,Shiro可以通过Realm获取用户的角色和权限信息,进行授权判断。 5. **单点登出(Single Logout, SLO)**:当用户在任一应用中登出时,通过CAS的SLO特性,可以确保用户在所有关联的应用中同时...

    shiro认证授权框架详解

    shiro 认证授权框架详解 Shiro 认证授权框架是 Java 中一种流行的认证授权解决方案,提供了完整的认证和授权机制,能够满足大多数应用程序的安全需求。Shiro 框架的核心思想是将认证和授权分离,认证负责验证用户...

    shiro认证和授权案例

    本案例将深入探讨Shiro如何实现用户登录认证和权限授权。 **一、Shiro认证流程** Shiro的认证过程主要涉及以下几个步骤: 1. **凭证匹配器(CredentialsMatcher)**:这是Shiro用来比对用户输入的凭证(如密码)...

    shiro 不执行授权方法 doGetAuthorizationInfo()

    Apache Shiro 是一个强大且易用的 Java 安全框架,提供身份认证、授权、加密和会话管理功能,可以非常容易地开发出足够安全的应用。在遇到“Shiro 不执行授权方法 `doGetAuthorizationInfo()`”的问题时,通常表明在...

    shiro权限管理案例加文档

    在这个“shiro权限管理案例加文档”中,我们很可能会找到关于如何在实际项目中应用Shiro进行权限控制的详细教程和实例。 **一、Shiro基础** Shiro的核心组件包括:Subject(主体)、Realms(域)、Cryptography...

    Shiro中进行角色与权限认证流程示例代码.zip

    Apache Shiro 是一个强大且易用的 Java ...通过以上步骤,我们就完成了 Shiro 中的角色与权限认证流程。这个示例代码可以帮助你理解如何在实际项目中运用 Shiro 实现用户身份验证和权限控制,确保应用程序的安全性。

    java shiro权限认证demo

    这个"java shiro权限认证demo"应该是展示如何在Java项目中使用Shiro进行用户权限验证的一个实例。下面,我们将深入探讨Shiro的核心概念以及如何在实践中应用它们。 1. **Shiro基础概念** - **身份验证...

Global site tag (gtag.js) - Google Analytics