Spring Security 不区分角色

2024-03-22

我正在使用 Spring Security 进行基本身份验证DaoAuthenticationProvider。我想预先授权我的请求,所以我使用@PreAuthorize注解。问题在于 Spring Security 似乎没有区分多个角色和权限。例如,如果我访问/users,系统提示我进入登录屏幕,但无论我使用哪个用户登录,我总是会显示所有用户的列表。这不是我想要实现的目标,我想将对用户列表的访问限制为角色管理员。

这是我的SecurityConfig:

@Configuration
@EnableGlobalMethodSecurity(securedEnabled = true)
@RequiredArgsConstructor(onConstructor = @__({@Autowired}))
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Autowired
    @Resource(name = "userRestClient")
    UserService userService;

    @Autowired
    private AuthenticationProvider authenticationProvider;

    @Autowired
    @Qualifier("authenticationProvider")
    public void setAuthenticationProvider(AuthenticationProvider authenticationProvider) {
        this.authenticationProvider = authenticationProvider;
    }

    @Autowired
    public void configureAuthManager(AuthenticationManagerBuilder authenticationManagerBuilder) {
        authenticationManagerBuilder.authenticationProvider(authenticationProvider);
    }

    @Bean
    public DaoAuthenticationProvider authenticationProvider() {
        DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
        authProvider.setUserDetailsService(userService);
        // authProvider.setPasswordEncoder(encoder());
        return authProvider;
    }

    @Bean
    public PasswordEncoder encoder() {
        return new BCryptPasswordEncoder(11);
    }

    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity
            .authorizeRequests()
                .antMatchers("/", "/users", "/user").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .logout().permitAll();
        httpSecurity
            .csrf().disable();
        httpSecurity
            .headers()
                .frameOptions().disable();
    }

    @Bean
    protected UserDetailsService userDetailsService() {
        return super.userDetailsService();
    }
}

这是我的控制器:

@Controller
@Component
public class UserWebController {

    private final UserRestClient userService = new UserRestClient();

    @PreAuthorize("hasRole('ROLE_ADMIN')")
    @RequestMapping(value = "/users", method = RequestMethod.GET)
    @Produces(MediaType.APPLICATION_JSON)
    public ResponseEntity<List<User>> getAllUsers() {
        List<User> users = userService.findAllUsers().stream().map(UserMapper.INSTANCE::from).collect(Collectors.toList());
        return new ResponseEntity<List<User>>(users, HttpStatus.OK);
    }
}

我的实施UserDetails界面:

public class MyUser implements UserDetails {

    private User user;

    public MyUser(User user) {
        this.user = user;
    }

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {

        Set<GrantedAuthority> roles = new HashSet<>();
        roles.add(new Authority(user.getRole()));
        return roles;
    }

    @Override
    public String getPassword() {
        return user.getPassword();
    }

    @Override
    public String getUsername() {
        return user.getUsername();
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }
}

用户实体:

@Table(name = "users")
@AllArgsConstructor
@Data
@NoArgsConstructor
@javax.persistence.Entity
public class User extends Entity implements Serializable {

    @Column(name = "username")
    private String username;

    @Column(name = "password")
    private String password;

    @Column(name = "role")
    private String role;
}

你必须启用@PreAuthorize, see EnableGlobalMethodSecurity#prePostEnabled http://docs.spring.io/spring-security/site/docs/current/apidocs/org/springframework/security/config/annotation/method/configuration/EnableGlobalMethodSecurity.html#prePostEnabled--:

确定是否应启用 Spring Security 的前置注释。默认为 false。

您修改和简化的配置:

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
@RequiredArgsConstructor(onConstructor = @__({@Autowired}))
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Autowired
    @Resource(name = "userRestClient")
    UserService userService;

    @Autowired
    private AuthenticationProvider authenticationProvider;

    @Autowired
    @Qualifier("authenticationProvider")
    public void setAuthenticationProvider(AuthenticationProvider authenticationProvider) {
        this.authenticationProvider = authenticationProvider;
    }

    @Autowired
    public void configureAuthManager(AuthenticationManagerBuilder authenticationManagerBuilder) {
        authenticationManagerBuilder.authenticationProvider(authenticationProvider);
    }

    @Bean
    public DaoAuthenticationProvider authenticationProvider() {
        DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
        authProvider.setUserDetailsService(userService);
        return authProvider;
    }

    @Bean
    public PasswordEncoder encoder() {
        return new BCryptPasswordEncoder(11);
    }

    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity
            .authorizeRequests()
                .antMatchers("/", "/users", "/user").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .logout()
                .permitAll()
                .and()
            .csrf()
                .disable()
                .and()
            .headers()
                .frameOptions().disable();
    }

    @Bean
    protected UserDetailsService userDetailsService() {
        return super.userDetailsService();
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Security 不区分角色 的相关文章

随机推荐

  • Spring Boot不加载静态资源

    有很多关于 spring boot 不加载静态资源的问题 并且读完它们 几乎 后我仍然无法解决这个问题 在这个阶段 我选择不使用 Spring Boot 运行 但我仍然想知道问题是什么 我正在使用 Eclipse Java 8 和 Mave
  • 使用 VLC 将文件流式传输为 RTSP

    我需要创建一个可以将 mp3 文件流式传输到另一个设备的服务器 我打算使用 VLC 我查看了 VLC 文档 并对执行此操作的前进方向感到困惑 我找到了这个链接 http www videolan org doc streaming howt
  • T-SQL 到 XML - 每个属性的多个值可以在自己的行中列出吗?

    我目前正在使用 T SQL 将一些数据转换为 XML 我需要在自己的行上列出属性的值 由于某种原因 T SQL 到 XML 不断将值连接在同一行上 示例代码 SELECT Fruits AS Attribute name Apple AS
  • jQuery 中的triggerHandler 与触发器

    出于好奇 jQuery 的目的 用例是什么triggerHandler 据我所知 两者之间唯一 真正 的区别trigger and triggerHandler是本机事件是否触发 以及事件冒泡行为 尽管triggerHandler的冒泡行为
  • RUBY - SSL、基本身份验证和 POST

    我对此感到相当困难 似乎有一些代码片段我似乎无法拼凑在一起 我只是想发布键 值对 但是得到Connection refused connect 2 Errno ECONNREFUSED Help require net http requi
  • Spark Driver 内存计算

    我知道如何计算执行器核心和内存 但是谁能解释一下spark driver memory是根据什么计算的 操作于Dataset比如collect take需要将所有数据移至应用程序的驱动程序进程中 并且在非常大的数据集上执行此操作可能会导致驱
  • MVC 3 授权自定义角色

    我是 MVC 3 新用户 我正在尝试通过 SQL 数据库进行管理 首先 我有客户实体 可以通过管理字段定义管理 该字段是客户实体中的布尔类型 我只想在产品页面中访问管理员 而不是在普通客户中 我想制作 Authorize Roles adm
  • 带字符串的多行内联汇编宏

    我正在尝试实现一个宏 MY MACRO 它存储某个部分中前面带有 32 位整数的字符串 my section 例子 MY MACRO 200 my first string u x 以下是我尝试过的选项以及我面临的问题 我将不胜感激任何帮助
  • 在调试器中跳过表达式主体属性

    有没有类似的 DebuggerStepThrough 属性可用于 C 中的表达式主体属性 例如我想跳过代码 public Byte ByteArray gt Builder CreateArray DebuggerStepThrough 不
  • 如何不在 NextJS 登录页面上渲染布局组件

    如何排除渲染Layout当路由为 login register等等 在 NextJS 中 const MyApp Component pageProps gt return
  • 为什么 javascript 在 if 语句中接受逗号?

    我偶然发现了一些 JavaScript 语法 看起来应该会产生某种解析错误 但实际上却没有 if true true console log splendid else console log horrid splendid if true
  • 隐藏选择的选项组及其内容(所选选项除外)

    我想为国家 地区创建一个选择标签 当我们选择国家 地区时 它会隐藏所有 optgroup 及其国家 地区选择标签的内容 但 optgroup 及其内容与所选国家 地区选项具有相同标签 例如
  • 为什么 std::apply 使用函数模板会失败,但使用具有显式模板参数列表的 lambda 表达式却不会失败?

    在查看 std apply 的引用时参考参数 https en cppreference com w cpp utility apply我们可以看到函数模板不能作为 std apply 的可调用对象传递 让我们考虑以下函数模板 templa
  • 带有 JavaFx 11 和 JDK 11 的 Netbeans 9.0

    我正在尝试在 NetBeans 9 上运行 JavaFX 11 由于 JDK 11 不再具有 JavaFX 我无法让 NetBeans 运行 JavaFX 项目 它说 Failed to automatically set up a Jav
  • 将带有扩展名的文件移动到某个位置

    如何将文件夹中的所有 txt 文件和所有包含的文件夹移动到目标目录中 最好将它们重命名为它们所在的文件夹 尽管这并不那么重要 我对 bash 不太熟悉 要递归移动文件 请组合find with mv find src dir name tx
  • 分布式开发团队 - 所需工具[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个开发团队分布在全球不同时区 在这样的团队中实现最大生产力的最佳工具是什么 我在寻找 源代码控制
  • 在透明导航栏和半透明之间过渡

    在苹果最近发布的远程应用程序中 我注意到导航栏的行为方式是独特的 但我无法重现它 弹出 正在播放 视图控制器时 正在播放 视图控制器的导航栏保持透明 而库视图控制器的导航栏也保持半透明 屏幕截图 1 我试图弄清楚他们是否使用两个导航控制器或
  • 如何在 geom_smooth 中使用 method="nlsLM" (在包 minpack.lm 中)

    test lt data frame Exp c 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 6 6 t c 0 0 33 0 67 1 1 33 1 67 2
  • 动态获取 TinyMCE 设置(将它们应用到另一个 init)

    我如何获得 TinyMCEsettings https www tinymce com docs api class tinymce init 我想从第一个编辑器中获取它们并存储在变量中 第一个或最后一个并不重要 只要相关脚本不依赖 id
  • Spring Security 不区分角色

    我正在使用 Spring Security 进行基本身份验证DaoAuthenticationProvider 我想预先授权我的请求 所以我使用 PreAuthorize注解 问题在于 Spring Security 似乎没有区分多个角色和