Spring Boot —— Security 控制按钮权限

文章目录

  • 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

<dependency>
    <groupId>org.springframework.securitygroupId>
    <artifactId>spring-security-taglibsartifactId>
    <version>5.0.7.RELEASEversion>
dependency>

<dependency>
    <groupId>javax.servlet.jspgroupId>
    <artifactId>jsp-apiartifactId>
    <version>2.2.1-b03version>
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自定义标签做到权限控制.

你可能感兴趣的:(技术总结,Spring,弗兰克与Spring,Framework)