Siteminder 的 Spring Security Java 配置

2023-11-23

我有一个有效的 inMemoryAuthentication 配置:

@Configuration
@EnableWebMvcSecurity
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(
            AuthenticationManagerBuilder authenticationManagerBuilder)
            throws Exception {

        authenticationManagerBuilder //
            .inMemoryAuthentication() //
                .withUser("employee") //
                    .password("employee") //
                    .roles("RoleEmployee")
        ;

    }

    @Override
    public void configure(WebSecurity webSecurity) throws Exception {
        webSecurity.ignoring().antMatchers("/resources/**");
    }

    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        // @formatter:off

        httpSecurity
            .authorizeRequests()
                .antMatchers("/login","/login.request","/logout").permitAll()
                .anyRequest().hasRole("RoleEmployee")
        .and()
            .formLogin()
                .loginPage("/login.request")
                .loginProcessingUrl("/login")
                .failureUrl("/login.request?error")
                .permitAll()
        .and()
            .logout()
                .logoutUrl("/logout")
                .permitAll()
                .logoutSuccessUrl("/login.request")
        ;

        // @formatter:on
    }
}

我现在想使用 Siteminder 身份验证并将其更改为:

@Configuration
@EnableWebMvcSecurity
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
    private UserDetailsService userDetailsService;  
    private PreAuthenticatedAuthenticationProvider preAuthenticatedProvider;

    public WebSecurityConfiguration() {
        super();

        userDetailsService = new CustomUserDetailsService();
        UserDetailsByNameServiceWrapper<PreAuthenticatedAuthenticationToken> wrapper = new UserDetailsByNameServiceWrapper<PreAuthenticatedAuthenticationToken>(
                userDetailsService);

        preAuthenticatedProvider = new PreAuthenticatedAuthenticationProvider();
        preAuthenticatedProvider.setPreAuthenticatedUserDetailsService(wrapper);
    }


    @Override
    protected void configure(
            AuthenticationManagerBuilder authenticationManagerBuilder)
            throws Exception {


        // @formatter:off
        authenticationManagerBuilder //
            .authenticationProvider(preAuthenticatedProvider);
        // @formatter:on
    }

    @Override
    public void configure(WebSecurity webSecurity) throws Exception {
        webSecurity.ignoring().antMatchers("/resources/**");
    }

    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        // @formatter:off

        RequestHeaderAuthenticationFilter siteMinderFilter = new RequestHeaderAuthenticationFilter();
        siteMinderFilter.setAuthenticationManager(authenticationManager());

        httpSecurity
            .addFilter(siteMinderFilter)
            .authorizeRequests()
                .antMatchers("/login","/login.request","/logout").permitAll()
                .anyRequest().hasRole("RoleEmployee")
        .and()
            .formLogin()
                .loginPage("/login.request")
                .loginProcessingUrl("/login")
                .failureUrl("/login.request?error")
                .permitAll()
        .and()
            .logout()
                .logoutUrl("/logout")
                .permitAll()
                .logoutSuccessUrl("/login.request")
        ;

        // @formatter:on
    }
}

目前,Custom UserDetailsS​​ervice 始终返回具有员工角色的用户:

public class CustomUserDetailsService implements
        UserDetailsService {
    @Override
    public UserDetails loadUserByUsername(String username)
            throws UsernameNotFoundException {
        List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
        SimpleGrantedAuthority authority = new SimpleGrantedAuthority("RoleEmployee");
        authorities.add(authority);

        UserDetails user = new User(username, "password", authorities);
        return user;    
    }
}

当我对此进行测试时,SM_USER 标头已正确传入,并且我可以在调试器中看到 CustomUserDetailsS​​erice 已正确调用,但对于我之前能够在旧配置下成功访问的任何页面,都会返回 403 Forbidden 状态。

这个配置有问题吗?


通常提出问题有助于回答问题。

改变:

anyRequest().hasRole("RoleEmployee")

to:

anyRequest().hasAuthority("RoleEmployee")

修复。

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

Siteminder 的 Spring Security Java 配置 的相关文章

随机推荐

  • 增加录制音频的音量输出

    我正在尝试在 Android 中制作一个通话录音应用程序 我正在使用扬声器录制上行链路和下行链路音频 我面临的唯一问题是音量太低 我已使用 AudioManager 将设备的音量增加到最大值 但不能超过该值 我首先使用MediaRecord
  • 修改使用 from ... import * 导入的模块中的变量

    考虑以下代码 main py From toolsmodule import database foo toolsmodule database mydatabase 看起来 这在每个模块中创建了一个具有不同内容的变量 如何从 main 修
  • 仅 Android 3.x WebView 文本选择 + JavaScript

    问题域 基于 Android WebView 的 ePub 格式阅读器 我们需要可通过 JavaScript 方法访问的文本突出显示 即打开 关闭 保存并通过电子邮件发送等 如果我的理解有误 请知情者指正 在 WebView 上选择文本时
  • Ruby Symbol#to_proc 在 1.9.2-p180 中泄漏引用?

    好的 这是我第二次尝试使用 Sinatra 应用程序调试内存问题 我相信这次我已经将其固定为简单的示例代码 看来当我过滤数组时 map some method 它会导致该数组中的项目无法被垃圾收集 运行等效的 map x x some me
  • 在 CLion 中设置 ROS 包

    我正在使用 CLion C IDE 来编辑 ROS 包 我可以通过打开CMakeLists txt文件 但是 我收到一个错误 FATAL ERROR find package catkin 失败 在工作区和 CMAKE PREFIX PAT
  • 需要帮助理解合并冲突示例

    我正在遵循一本书中的示例 该示例没有显示解决合并冲突的步骤 正如这篇文章中提到的 该教程对我不起作用 在本地系统上模拟多个用户 提交者所以 我什至无法学习合并 以下是从书中复制的步骤 现在打开空白participants txt文件并将以下
  • 在 Haskell 中简单输入 lambda 演算失败

    我是 Haskell 的新手 所以如果这个问题没有太大意义 我深表歉意 我希望能够在 Haskell 中实现简单类型的 lambda 表达式 这样当我尝试将一个表达式应用于另一个表达式时wrongtype 结果不是类型错误 而是一些设置值
  • 使用 dplyr 对多个变量的所有可能组合进行分组

    考虑到如下情况 library dplyr myData lt tbl df data frame var1 rnorm 100 var2 letters 1 3 gt sample 100 replace TRUE gt factor v
  • 运行 Heckle 时出错? “current_code”:Ruby2Ruby 的未定义方法“translate”

    我正在尝试运行 Heckle 但不断收到错误消息 gt spec spec controllers my controller spec rb heckle MyController exception has a thick skin T
  • 为什么 IE7 和 IE8 在调用 jQuery 时给出“访问被拒绝”?

    我正在使用 Google CDN 将 jQuery 1 4 2 Min 文件调用到我的应用程序中 FF Chrome Safari 一切都运行良好 但由于某种原因 我在第 127 行的 jquery min js 文件中收到 访问被拒绝 错
  • 返回无效引用

    有时 当我用 C 编程时 我希望有一个undefined每个变量的值 例如 Javascript 例如 当我返回数组的越界元素的值时 返回undefined而不是抛出异常 或者 template
  • Angular2 路由守卫返回 Observable,如何处理错误

    我有一个如下所示的路线守卫 Injectable export class AuthGuard implements CanActivate constructor private router Router private authent
  • 执行描述 shell 命令的字符串数组

    我正在努力执行一组作为字符串存储在数组中的命令行 我的代码如下所示 arr sudo apt get update sudo apt get install xxx arr arr ln s path1 path2 etc Then I l
  • 是否为每个请求创建新的套接字?

    我正在尝试了解网络套接字 到目前为止 我的理解是服务器创建一个绑定到特定端口的新套接字 然后它监听这个套接字来处理客户端请求 我已阅读本教程http docs oracle com javase tutorial networking so
  • 使用 grid_2d_graph 在 networkx 中绘制 MxM 节点的方形网格时消除旋转效果

    我需要生成一个正则图 也称为格子网络 其中有100x100节点 我开始画一个10x10带有以下代码的图表 import numpy from numpy import import networkx as nx from networkx
  • 调用 std::set::find 时避免 const_cast

    有什么好的方法可以避免const cast下面 同时保持 const 正确性 Without const cast下面的代码无法编译 set find获取对集合键类型的 const 引用 因此在我们的例子中 它保证不会更改传入的指针值 然而
  • Python TypeError:/ 不支持的操作数类型:“NoneType”和“float”

    这是我们老师给我们布置的作业 我们应该使用辛普森规则对函数进行数值积分f x x cos third root x 但我们不允许使用内置函数cos or use x 1 0 3 0 找到第三个根 我收到错误 Traceback most r
  • 如何在Django中创建由两个字段组成的主键?

    我开发了一个特定的应用程序 我发现它具有指定的数据库和模型架构 我正在使用 Django 版本 1 8 2 下面提出一个问题 不必要的字段已被省略 模型名称是出于示例目的而发明的 因为我无法透露 考虑以下模型 A 和 B class B m
  • 验证非模型字段

    我在我的中添加了一个额外的字段new form 它指定要创建的记录的副本数 我如何验证该字段的存在 或数值 因为它不是模型本身的一部分 validates presence of quantity fails 成立 您可能想在模型中添加虚拟
  • Siteminder 的 Spring Security Java 配置

    我有一个有效的 inMemoryAuthentication 配置 Configuration EnableWebMvcSecurity public class WebSecurityConfiguration extends WebSe