如何提供访问权限(Spring Security)[关闭]

Posted

技术标签:

【中文标题】如何提供访问权限(Spring Security)[关闭]【英文标题】:How to provide access (Spring Security) [closed] 【发布时间】:2019-10-24 13:27:50 【问题描述】:

如何设置权限,以便只有管理员可以使用他的用户名和密码访问 JSP 页面。假设一个页面 (allStudents.jsp) 仅对管理员可用,为此他必须输入他的用户名和密码

如何设置权限,以便只有管理员可以使用他的用户名和密码访问 JSP 页面。假设一个页面 (allStudents.jsp) 仅对管理员可用,为此他必须输入他的用户名和密码

package adil.java.schoolmaven.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.authentication.www.BasicAuthenticationFilter;
import org.springframework.stereotype.Component;

@Order(1)
@Configuration
@EnableWebSecurity
@Component
public class CustomWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter 

    @Autowired
    private MyBasicAuthenticationEntryPoint authenticationEntryPoint;

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception 
        auth.inMemoryAuthentication()
          .withUser("admin").password(passwordEncoder().encode("1234"))
          .authorities("ROLE_ADMIN");
    

    @Override
    protected void configure(HttpSecurity http) throws Exception 
        http.authorizeRequests()
          .antMatchers("/securityNone").permitAll() //??????
          .anyRequest().authenticated()
          .and()
          .httpBasic()
          .authenticationEntryPoint(authenticationEntryPoint);

        http.addFilterAfter(new CustomFilter(),
          BasicAuthenticationFilter.class);
    

    @Bean
    public PasswordEncoder passwordEncoder() 
        return new BCryptPasswordEncoder();
    

enter image description here

我已更改代码请查看此代码

@Order(1)
@Configuration
@EnableWebSecurity
@Component
public class СostumWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter 

    @Autowired
    private MyBasicAuthenticationEntryPoint authenticationEntryPoint;

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception 
        auth.inMemoryAuthentication()
          .withUser("admin").password(passwordEncoder().encode("1234"))
          .authorities("ROLE_ADMIN");
    

    @Override
    protected void configure(HttpSecurity http) throws Exception 
        http.authorizeRequests()
          .antMatchers("/allStudents").hasRole("ADMIN");
          .anyRequest().authenticated()
          .and()
          .httpBasic()
          .authenticationEntryPoint(authenticationEntryPoint);

        http.addFilterAfter(new CustomFilter(),
          BasicAuthenticationFilter.class);
    

    @Bean
    public PasswordEncoder passwordEncoder() 
        return new BCryptPasswordEncoder();
    

【问题讨论】:

调用 allStudents.jsp 的端点是什么?你能把你的控制器贴在你调用 allStudents.jsp 的地方吗? 【参考方案1】:

整页授权示例

为 http 元素启用表达式后,可以使用 URL 模式 保护如下:

@Configuration
@EnableWebSecurity
public class SecSecurityConfig extends WebSecurityConfigurerAdapter 
    @Override
    protected void configure(HttpSecurity http) throws Exception 
        http
          .authorizeRequests()
          .antMatchers("/allStudents").hasRole("ROLE_ADMIN"); // assuming this is your endpoint/controller for allStudents.jsp page
    

方法级授权示例——@PreAuthorize

安全表达式可用于保护业务功能 方法级别也是如此,通过使用注释。

注解@PreAuthorize 和@PostAuthorize(以及 @PreFilter 和 @PostFilter) 支持 Spring 表达式语言 (SpEL) 并提供基于表达式的访问控制。

首先,为了使用方法级别的安全性,我们需要启用这个 在使用@EnableGlobalMethodSecurity 的安全配置中:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter 
   ...

然后,我们可以使用 Spring @PreAuthorize 注解来保护方法:

@Service
public class FooService 
    @PreAuthorize("hasRole('ROLE_ADMIN')")
    public List<Foo> findAll()  ... 
    ...


对于这个例子更深入的解释,可以参考这个link

【讨论】:

.hasRole("ADMIN") 更改为.hasRole("ROLE_ADMIN"),因为这是您在内存身份验证用户中设置的角色。

以上是关于如何提供访问权限(Spring Security)[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

spring security需要登录后才能访问的路径的权限配置是怎么样的

Spring Security源码:权限访问控制是如何做到的?

Spring Security源码:权限访问控制是如何做到的?

Spring Security——基于表达式的权限控制

Grails 中的 Spring Security 提供授权

如何控制项目的访问权限来保证项目安全?SpringBoot 集成 Spring Security 安全框架使用指南