JavaWeb 利用springsecurity做用户权限限制

简介: JavaWeb 利用springsecurity做用户权限限制

JavaWeb 利用springsecurity做用户权限限制。


一、概述


不同的user(用户)需要不同的role(角色),不同的role(角色)又会需要不同的resource(资源权限),比如说我王二,是个管理员(admin),我的权限大到什么都能操作,包括新建一个代理(proxy),再比如说我弟弟王三,是个代理(proxy),他却不能新建代理,他权限不够大。


利用springsecurity来实现的话,就非常简便(当然了,必须先做点准备工作)。


<security:authorize name="newAgentPage">
    <li><a class="add" title="新建代理"><span>新建代理</span></a></li>
</security:authorize>

注释一下:


security是规定的一个taglib前标记。

authorize是规定的一个tld后标记。

name是规定的适配属性。

newAgentPage是规定的权限名字。

二、直观体验


来看看我王二和弟弟王三的操作权限效果:

image.png


三、具体实现


1、添加security前缀


<%@ taglib prefix="security" uri="http://www.springsecurity.org/jsp"%>


2、添加authorize后缀


<?xml version="1.0" encoding="UTF-8" ?>  
<taglib xmlns="http://java.sun.com/xml/ns/javaee"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
   http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"  
    version="2.1">  
    <description>  
    <![CDATA[security Tags]]>  
    </description>  
    <tlib-version>1.0</tlib-version>  
    <short-name>security</short-name>  
    <uri>http://www.springsecurity.org/jsp</uri>  
    <tag>  
        <description>  
        <![CDATA[authorize Tag]]>  
        </description>  
        <name>authorize</name>  
        <tag-class>  
            com.honzh.security.filter.tag.AuthorizeTag
        </tag-class>  
        <body-content>JSP</body-content>  
        <attribute>  
            <name>name</name>  
            <required>false</required>  
            <rtexprvalue>true</rtexprvalue>  
            <type>java.lang.String</type>  
        </attribute>  
    </tag>  
</taglib>

把以上xml内容保存到WebContent/WEB-INF目录下的authorize.tld文件中。

稍作注释:


name标签中authorize就是定义的后缀名。

tag-class标签中为继承BodyTagSupport标记的子类,3小节中介绍。

attribute标签中定义了name属性,用来页面上传递name的value值。

3、AuthorizeTag类

package com.honzh.security.filter.tag;
import java.util.HashMap;
import java.util.List;
import javax.servlet.jsp.tagext.BodyTagSupport;
import org.apache.log4j.Logger;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import com.honzh.biz.database.entity.security.SecurityUserDto;
public class AuthorizeTag extends BodyTagSupport {
    private static Logger logger = Logger.getLogger(AuthorizeTag.class);
    private static final long serialVersionUID = -5772328723066649929L;
    // 页面上设置的name值
    private String name;
    /*
     * (non-Javadoc)
     * 
     * @see javax.servlet.jsp.tagext.BodyTagSupport#doStartTag()
     */
    @SuppressWarnings("unchecked")
    public int doStartTag() {
        try {
            // 登陆用户的权限对象
            Authentication auth = SecurityContextHolder.getContext().getAuthentication();
            if (auth == null) {
                return SKIP_BODY;
            }
            // 封装了一系列便捷信息的登陆用户
            SecurityUserDto securityUserDto = (SecurityUserDto) auth.getPrincipal();
            // 匹配用户是否具有该权限
            List<HashMap<String, String>> resources = securityUserDto.getResources();
            for (HashMap<String, String> resource : resources) {
                if (resource.get("name").equals(this.getName())) {
                    return EVAL_BODY_INCLUDE;
                }
            }
        } catch (Exception e) {
            logger.error(e.getMessage());
            logger.error(e.getMessage(), e);
        }
        return SKIP_BODY;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

稍作介绍:


对于BodyTagSupport 类,你可以参照自定义jsp标签: TagSupport与BodyTagSupport的区别 (转),了解一下类方法介绍,以及常量作用。

SecurityUserDto 类是针对我项目封装的用户权限类,主要作用就是获取登陆用户的角色,角色对应的权限,限于篇幅,本篇只做简单的介绍。


相关文章
|
安全 jenkins Java
4❤️Jenkins从零到壹❤️ :用户权限管理(JAVA 小虚竹)
4❤️Jenkins从零到壹❤️ :用户权限管理(JAVA 小虚竹)
136 0
4❤️Jenkins从零到壹❤️ :用户权限管理(JAVA 小虚竹)
|
XML 数据安全/隐私保护 数据格式
JavaWeb 利用springsecurity做用户权限限制(2)
JavaWeb 利用springsecurity做用户权限限制
129 0
JavaWeb 利用springsecurity做用户权限限制(2)
|
XML 安全 Java
JavaWeb 利用springsecurity做用户权限限制
版权声明:欢迎转载,请注明沉默王二原创。 https://blog.csdn.net/qing_gee/article/details/50184583 JavaWeb 利用springsecurity做用户权限限制。
1324 0
|
4天前
|
Java 程序员 开发者
Java社招面试题:一个线程运行时发生异常会怎样?
大家好,我是小米。今天分享一个经典的 Java 面试题:线程运行时发生异常,程序会怎样处理?此问题考察 Java 线程和异常处理机制的理解。线程发生异常,默认会导致线程终止,但可以通过 try-catch 捕获并处理,避免影响其他线程。未捕获的异常可通过 Thread.UncaughtExceptionHandler 处理。线程池中的异常会被自动处理,不影响任务执行。希望这篇文章能帮助你深入理解 Java 线程异常处理机制,为面试做好准备。如果你觉得有帮助,欢迎收藏、转发!
45 14
|
7天前
|
安全 Java 程序员
Java 面试必问!线程构造方法和静态块的执行线程到底是谁?
大家好,我是小米。今天聊聊Java多线程面试题:线程类的构造方法和静态块是由哪个线程调用的?构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节有助于掌握Java多线程机制。下期再见! 简介: 本文通过一个常见的Java多线程面试题,详细讲解了线程类的构造方法和静态块是由哪个线程调用的。构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节对掌握Java多线程编程至关重要。
37 13
|
8天前
|
安全 Java 开发者
【JAVA】封装多线程原理
Java 中的多线程封装旨在简化使用、提高安全性和增强可维护性。通过抽象和隐藏底层细节,提供简洁接口。常见封装方式包括基于 Runnable 和 Callable 接口的任务封装,以及线程池的封装。Runnable 适用于无返回值任务,Callable 支持有返回值任务。线程池(如 ExecutorService)则用于管理和复用线程,减少性能开销。示例代码展示了如何实现这些封装,使多线程编程更加高效和安全。
|
1月前
|
缓存 安全 算法
Java 多线程 面试题
Java 多线程 相关基础面试题
|
1月前
|
监控 Java
java异步判断线程池所有任务是否执行完
通过上述步骤,您可以在Java中实现异步判断线程池所有任务是否执行完毕。这种方法使用了 `CompletionService`来监控任务的完成情况,并通过一个独立线程异步检查所有任务的执行状态。这种设计不仅简洁高效,还能确保在大量任务处理时程序的稳定性和可维护性。希望本文能为您的开发工作提供实用的指导和帮助。
109 17
|
2月前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者
|
2月前
|
消息中间件 缓存 安全
Java多线程是什么
Java多线程简介:本文介绍了Java中常见的线程池类型,包括`newCachedThreadPool`(适用于短期异步任务)、`newFixedThreadPool`(适用于固定数量的长期任务)、`newScheduledThreadPool`(支持定时和周期性任务)以及`newSingleThreadExecutor`(保证任务顺序执行)。同时,文章还讲解了Java中的锁机制,如`synchronized`关键字、CAS操作及其实现方式,并详细描述了可重入锁`ReentrantLock`和读写锁`ReadWriteLock`的工作原理与应用场景。

热门文章

最新文章