Spring Boot —— Security 控制按钮权限

Spring Boot —— Security 控制按钮权限

前言

在freemarker中, 通过Security根据用户角色控制页面按钮或菜单的显示。

Security提供一套页面标签,可以做到让内容根据安全配置情况显示或不显示,ftl 伪代码如下:

<#assign security=JspTaglibs["http://www.springframework.org/security/tags"]/>
<@security.authorize access='hasAnyAuthority("ADMIN")'>
    只有ADMIN才能看到
</@security.authorize>
<@security.authorize access='hasAnyAuthority("OTHER")'>
    只有OTHER才能看到
</@security.authorize>

那我们如何实现呢?

实现

引入对应的依赖

为了让freemarker中可以使用这种标签,需要在pom中引入对应依赖。

  • pom.xml
<!-- security标签库 -->
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-taglibs</artifactId>
    <version>5.0.7.RELEASE</version>
</dependency>
<!-- 让freemarker支持引用标签 -->
<dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>jsp-api</artifactId>
    <version>2.2.1-b03</version>
</dependency>

配置标签

  • 新增读取标签库的类 ClassPathTldsLoader
public class ClassPathTldsLoader {

    @Autowired
    private FreeMarkerConfigurer freeMarkerConfigurer;

    /**
     * 指定路径,我们通过pom引入的
     * security.tld 中存放标签
     */
    private static final String SECURITY_TLD = "/META-INF/security.tld";

    final private List<String> classPathTlds;

    public ClassPathTldsLoader(String... classPathTlds) {
        super();
        if(classPathTlds == null || classPathTlds.length <= 0){
            this.classPathTlds = Arrays.asList(SECURITY_TLD);
        }else{
            this.classPathTlds = Arrays.asList(classPathTlds);
        }
    }

    @PostConstruct
    public void loadClassPathTlds() {
        freeMarkerConfigurer.getTaglibFactory().setClasspathTlds(classPathTlds);
    }

}
  • 启动时将标签读取类被Spring管理

@Configuration
@EnableWebSecurity
// 开启基于方法的声明式权限控制
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

	...
	...
	...
	
	/**
	 * 加载 ClassPathTldsLoader
	 * @return
	 */
	@Bean
	@ConditionalOnMissingBean(ClassPathTldsLoader.class)
	public ClassPathTldsLoader classPathTldsLoader(){
	    return new ClassPathTldsLoader();
	}
	...
	...
	...
}

这样就可以在freemarker中使用Spring Security自定义标签做到权限控制.

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页