Spring安全吃Angularjs POST请求

2024-03-06

使用 Spring Security 自定义登录表单时,我从 UI 传递的参数在 HttpServletRequest 中无法访问。

class StatelessLoginFilter extends AbstractAuthenticationProcessingFilter {

    private final TokenAuthenticationService tokenAuthenticationService;
    private final CustomJDBCDaoImpl userDetailsService;

    protected StatelessLoginFilter(String urlMapping, TokenAuthenticationService tokenAuthenticationService,
            CustomJDBCDaoImpl userDetailsService, AuthenticationManager authManager) {
        super(new AntPathRequestMatcher(urlMapping));
        this.userDetailsService = userDetailsService;
        this.tokenAuthenticationService = tokenAuthenticationService;
        setAuthenticationManager(authManager);
    }

    @Override
    public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response)
            throws AuthenticationException, IOException, ServletException {

                final UsernamePasswordAuthenticationToken loginToken = new UsernamePasswordAuthenticationToken(
                request.getAttribute("email").toString(), request.getAttribute("password").toString());
        return getAuthenticationManager().authenticate(loginToken);
    }

    @Override
    protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response,
            FilterChain chain, Authentication authentication) throws IOException, ServletException {

        final UserDetails authenticatedUser = userDetailsService.loadUserByUsername(authentication.getName());
        final UserAuthentication userAuthentication = new UserAuthentication(authenticatedUser);

        tokenAuthenticationService.addAuthentication(response, userAuthentication);
        SecurityContextHolder.getContext().setAuthentication(userAuthentication);
    }
}

在 AttemptAuthentication 方法中,请求未采用我使用以下代码从 POST 请求传递的属性:

 var request = $http.post('/verifyUser', 
       {email: 'user', password: 'user',_csrf: $cookies['XSRF-TOKEN']})

我尝试使用调试器控制台跟踪它,发现有效负载填充了我转发的元素。

{“电子邮件”:“用户”,“密码”:“用户”,“_csrf”:“f1d88246-28a0-4e64-a988-def4cafa5004”}

我的安全配置是:

http
                .exceptionHandling().and()
                .anonymous().and()
                .servletApi().and()
                .headers().cacheControl().and()
                .authorizeRequests()

                //allow anonymous resource requests
                .antMatchers("/").permitAll()               
                //allow anonymous POSTs to login
                .antMatchers(HttpMethod.POST, "/verifyUser").permitAll()
                .and()
                  .formLogin().loginPage("/signin")
                .permitAll()
                .and()

                .addFilterBefore(new StatelessLoginFilter("/verifyUser", new TokenAuthenticationService("456abc"), new CustomJDBCDaoImpl() , authenticationManager()), UsernamePasswordAuthenticationFilter.class)


                .addFilterBefore(new StatelessAuthenticationFilter(new TokenAuthenticationService("456abc")), UsernamePasswordAuthenticationFilter.class).httpBasic()
                         .and().csrf().disable().addFilterBefore(new CSRFFilter(), CsrfFilter.class);

EDIT # 1

我还尝试使用 getParameter("email") 而不是 getAttribute("email"),但是此时整个参数映射也为空。

编辑#2:添加请求内容

Remote Address:127.0.0.1:80
Request URL:http://localhost/api/verifyUser/
Request Method:POST
Status Code:502 Bad Gateway
Response Headers
view source
Connection:keep-alive
Content-Length:583
Content-Type:text/html
Date:Sun, 11 Oct 2015 17:23:24 GMT
Server:nginx/1.6.2 (Ubuntu)
Request Headers
view source
Accept:application/json, text/plain, */*
Accept-Encoding:gzip, deflate
Accept-Language:en-US,en;q=0.8
Connection:keep-alive
Content-Length:81
Content-Type:application/x-www-form-urlencoded
Cookie:XSRF-TOKEN=f1d88246-28a0-4e64-a988-def4cafa5004
Host:localhost
Origin:http://localhost
Referer:http://localhost/ui/
User-Agent:Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.85 Safari/537.36
X-XSRF-TOKEN:f1d88246-28a0-4e64-a988-def4cafa5004
Form Data
view source
view URL encoded
{"email":"user","password":"user"}:

The email and password您想要的数据是参数,而不是属性。 ServletRequest 中的属性仅是服务器端数据,您可以在应用程序中使用它们在类之间或向 JSP 传递数据。

注意:您必须使用内容类型application/x-www-form-urlencoded并确保请求正文以正确的格式进行编码以供使用getParameter在服务器端,例如email=user&password=user.

默认情况下,Angular 会将对象编码为 JSON

转换请求和响应 https://docs.angularjs.org/api/ng/service/%24http

Angular 提供以下默认转换:

请求转换($httpProvider.defaults.transformRequest 和 $http.defaults.transformRequest):

如果请求配置对象的 data 属性包含 对象,将其序列化为 JSON 格式。

另请参阅如何在 AngularJS 中使用 $http 发布 urlencoded 表单数据? https://stackoverflow.com/questions/24710503/how-do-i-post-urlencoded-form-data-with-http-in-angularjs

getAttribute() 和 getParameter() 之间的区别 https://stackoverflow.com/questions/5243754/difference-between-getattribute-and-getparameter

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

Spring安全吃Angularjs POST请求 的相关文章

随机推荐

  • 如何在 DataGridViewImageColumn 中添加图像?

    我有一块田地DataGridViewImageColumn 对于字段的每一行 根据条件 我添加不同的图像 有人知道我如何在 Windows 窗体中执行此操作吗 if dgvAndon Rows e RowIndex Cells urgenc
  • WordPress 在管理中提供本机日期选择器吗?

    我正在开发一个插件 并在管理中提供一个由用户填写日期的字段 我想知道 WP Admin I 中是否有可用的本机日期选择器 我通常会包含一个小的 jQuery datepicker 脚本来执行此操作 但如果一个已经可用 我会更喜欢它 因为明显
  • 为什么 paramiko 偶尔会引发异常?

    为了方便起见 我编写了一个小包装类来登录远程主机 执行命令 结束检索数据 def MySSHClient def connect self remoteHost remotePort userName password self s par
  • 将文本区域包裹在 HTML 元素周围

    有什么方法可以将 textarea HTML 元素包裹在 HTML 元素周围吗 就我而言 我想将文本区域包裹在标签周围 这就是我试图实现的目标 Label name 其中 是文本区域 你不能使用HTML里面有标签
  • 如何在画布上移动图像?

    我有一个简单的射击画布游戏 运行得很好 但我的问题是我想要图像进行拍摄而不是蓝色矩形 那么我怎样才能让我的图像移动并拍摄掉下来的橙色矩形呢 这是我的代码 function initCanvas var ctx document getEle
  • 从参数设置 Rmarkdown 中的文档标题

    我有一个运行良好的 Rmarkdown 模板 并且对其进行了参数化 这样我就可以从不同的数据源生成同一报告的变体 但是 我想更改每种情况下的报告标题 我怎么做 这是我迄今为止拥有的 YAML 标头 title My Title author
  • 使用bash脚本修改配置文件

    我正在编写一个 bash 脚本来修改包含一堆键 值对的配置文件 我如何读取密钥并找到值并可能修改它 在黑暗中疯狂地修改单个值 sed c i s TARGET KEY 1 REPLACEMENT VALUE CONFIG FILE 假设目标
  • 哪个服务可以转换 AngularJS 中的元素和属性名称?

    AngularJS 在 HTML 标记和 JS 之间转换元素和属性名称 用驼峰命名法替换破折号 即 myComponent gt my component 反之亦然 哪个 AngularJS 服务或函数可以做到这一点 谢谢 尼基塔 执行此操
  • XCode“此时无法安装此应用程序。”

    在构建我的目标之一时 我对 XCode 遇到了一些小烦恼 构建成功 但是一旦在模拟器中启动它 我就会收到此提示 This app could not be installed at this time 仅当应用程序事先安装在模拟器上时才会发
  • 在 PHP 中将 SELECT 查询的结果打印为预格式化文本?

    我正在寻找一种简单快捷的方法来将 PHP 中的 MySQL SELECT 查询结果打印为预格式化文本 我想要的是能够将查询对象传递给函数并获得记录集的打印输出 就像命令行 MySQL 客户端在运行 SELECT 语句时所做的那样 下面是我希
  • 同一页面上有多个 ClojureScript 文件

    我有一个使用 Jasmine 来测试 JavaScript 的项目 我正在尝试切换到使用 ClojureScript 作为前端 我的project clj is like defproject myproject 0 1 0 SNAPSHO
  • 在 SQL Server 和 VB.Net 之间保持一致的日期时间格式的最佳方法

    我正在开发一个 VB Net 应用程序 该应用程序的操作严重依赖于日期和时间 由于如果应用程序日期格式与服务器日期格式不匹配 则日期格式可能会发生冲突 因此解决此问题的最佳实践是什么 我知道 SQL Serverdatetime格式取决于服
  • 一种更快的方法来实现 intersect() 给我的目标?

    我发现一个lot我的 matlab 函数花费的时间在这段代码中 intersect freq bins our bins 两者都可以是相当大的向量 并且仅由整数组成 我只需要知道两者中都有哪些整数 这确实是 intersect 的原始目的
  • 使用 VideoView 进行流式传输或渐进式下载视频

    我对如何使用 VideoView 播放视频感到困惑 从本地文件播放视频 作为渐进式下载和流式传输 这个例子 http davanum wordpress com 2009 12 04 android E2 80 93 videomusic
  • 面向非 Web 程序员的 Web 编程(Perl)

    我希望开始使用 Perl 进行 Web 编程 Perl 是我唯一知道的语言 问题是 除了上网之外 我对任何与网络有关的事情一无所知 我不知道从哪里开始 所以我的问题是 我从哪里开始学习网络编程 我应该知道什么 我应该用什么 需要理解的关键事
  • GTK+ g_pointer_connect 传递数据不正确

    使用 g signal connect 时 我在将数据传递给函数时遇到问题 guint x 777 gpointer ptr x g print std to string guint p c str g signal connect G
  • mongorestore 无限期挂起

    我正在尝试使用恢复数据库mongorestore来自 gzip 文件 数据库大小约为 89MB gzip 文件约为 4 4MB 但是 恢复会无限期挂起 并且不会出现错误消息 我应该如何解决这个问题 我运行的命令是 mongorestore
  • 使用 py2exe 为 python 代码构建可执行文件

    我为 Python2 7 安装了 py2exe 制作了一个 Hello World 程序 使用py2exe构建了它的exe 它运行得很好 现在 当我尝试构建实际代码的 exe 时 文件夹被创建 并且 exe 也被创建 没有任何问题 但是当我
  • 是否可以使用 vscode 连接到远程 gdb 目标?

    我正在尝试设置配置以附加到使用 Visual Studio 代码运行 gdbserver 的远程 C C gdb 目标 目前支持吗 如果是这样 我该如何克服这些限制 地址和端口选项表明它们不支持 C C 我可以强制代码使用 gdb 的特殊远
  • Spring安全吃Angularjs POST请求

    使用 Spring Security 自定义登录表单时 我从 UI 传递的参数在 HttpServletRequest 中无法访问 class StatelessLoginFilter extends AbstractAuthenticat