Spring Security,安全访问和非安全访问

2024-02-19

我正在做一个需要先登录的小应用程序。但对于某些第三方工具,我想提供一个不需要登录的API。登录本身工作正常,API 本身工作正常,但我不知道如何告诉 Spring Security,无需身份验证即可访问 API。我在这里和其他网站上检查了几个主题并尝试了不同的版本,但没有一个有效。每次我尝试访问 API 时,我都会被转发到登录表单,并且必须先登录。

到目前为止,我的代码在我的 Spring Security 配置中看起来像这样:

/**
 * configuration of spring security, defining access to the website
 * 
 * @param http
 * @throws Exception 
 */
@Override
protected void configure(HttpSecurity http) throws Exception {        
    http.authorizeRequests()                
            .antMatchers("/rest/open**").permitAll()
            .antMatchers("/login**").permitAll()
            .and()
        .authorizeRequests()
            .anyRequest()
            .authenticated()
            .and()
        .formLogin()
            .loginPage("/login")
            .failureUrl("/login?error")
            .defaultSuccessUrl("/dashboard")
            .loginProcessingUrl("/j_spring_security_check")
            .usernameParameter("username")
            .passwordParameter("password")
            .and()
        .logout()
            .logoutUrl("/j_spring_security_logout")
            .logoutSuccessUrl("/login?logout")
            .and()
        .csrf();
}

还有我的控制器:

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class PredictionOpenRestController {

    @RequestMapping("/rest/open/prediction")
    public String getPrediction() {
        return "First Try!";
    }
}

不知怎的,我总感觉错过了什么。


See Spring安全参考 http://docs.spring.io/spring-security/site/docs/4.1.2.RELEASE/reference/htmlsingle/#authorize-requests:

我们的示例仅要求用户进行身份验证,并且对应用程序中的每个 URL 都进行了身份验证。我们可以通过向 URL 添加多个子项来指定 URL 的自定义要求http.authorizeRequests()方法。例如:

protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()                                                                
            .antMatchers("/resources/**", "/signup", "/about").permitAll()
            .antMatchers("/admin/**").hasRole("ADMIN")
            .antMatchers("/db/**").access("hasRole('ADMIN') and hasRole('DBA')")  
            .anyRequest().authenticated()
            .and()
        // ...
        .formLogin();
}

1 有多个孩子http.authorizeRequests()方法 每个匹配器按照声明的顺序进行考虑。

2 我们指定了任何用户都可以访问的多个 URL 模式。具体来说,如果 URL 以“/resources/”开头、等于“/signup”或等于“/about”,则任何用户都可以访问请求。

3 任何以“/admin/”开头的 URL 将仅限于具有“ROLE_ADMIN”角色的用户。您会注意到,由于我们正在调用 hasRole 方法,因此不需要指定“ROLE_”前缀。

4 任何以“/db/”开头的 URL 都要求用户同时拥有“ROLE_ADMIN”和“ROLE_DBA”。您会注意到,由于我们使用的是 hasRole 表达式,因此不需要指定“ROLE_”前缀。

5 任何尚未匹配的 URL 仅需要对用户进行身份验证

您的第二次使用.authorizeRequests()覆盖第一个。

另请参阅蚂蚁路径匹配器 http://docs.spring.io/autorepo/docs/spring-framework/4.2.1.RELEASE/javadoc-api/org/springframework/util/AntPathMatcher.html:

映射使用以下规则匹配 URL:

?匹配一个字符

*匹配零个或多个字符

**匹配路径中的零个或多个目录

Examples

com/t?st.jsp- 火柴com/test.jsp但是也com/tast.jsp or com/txst.jsp

com/*.jsp— 匹配所有.jsp文件在com目录

com/**/test.jsp— 匹配所有test.jsp下面的文件com path

org/springframework/**/*.jsp— 匹配所有.jsp下面的文件org/springframework path

org/**/servlet/bla.jsp- 火柴org/springframework/servlet/bla.jsp但是也org/springframework/testing/servlet/bla.jsp and org/servlet/bla.jsp

您修改后的代码:

protected void configure(HttpSecurity http) throws Exception {        
    http.authorizeRequests()                
            .antMatchers("/rest/open/**").permitAll()
            .antMatchers("/login/**").permitAll()
            .anyRequest().authenticated()
            .and()
        .formLogin()
            .loginPage("/login")
            .failureUrl("/login?error")
            .defaultSuccessUrl("/dashboard")
            .loginProcessingUrl("/j_spring_security_check")
            .usernameParameter("username")
            .passwordParameter("password")
            .and()
        .logout()
            .logoutUrl("/j_spring_security_logout")
            .logoutSuccessUrl("/login?logout")
            .and()
        .csrf();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Security,安全访问和非安全访问 的相关文章

随机推荐

  • 在没有 JavaScript 的情况下将 HTML 元素与父元素的中间对齐

    我想在元素中间放置一个 水平对齐很容易 当然垂直对齐也可以用JS来完成 但我确信用CSS有更好的方法 有什么窍门呢 附 我需要这个用于具有 HTML5 元素的应用程序 因此我不介意该解决方案是否仅适用于支持画布的浏览器和 IE 7 8 使用
  • 使用 Typescript 时如何更新 Next-auth 中会话回调中的会话类型

    我正在使用打字稿 我的 next auth tsx 文件如下所示 import NextAuth Awaitable Session User from next auth import GithubProvider from next a
  • 如何使用try catch语句抛出错误?

    Utility const readUserUtility id a gt const currentstore store getState const returnedArray currentstore users filter us
  • 使用多个跟踪侦听器

    我有 2 个 WCF 服务 它们是从单个 Windows 主机托管的 我使用跟踪侦听器将数据记录到应用程序日志中 我已将以下代码添加到配置文件中
  • 插入符号训练的公式和非公式结果不同

    我注意到在训练时使用插入符中的公式和非公式方法会产生不同的结果 此外 公式方法所需的时间几乎是非公式方法所需时间的 10 倍 这是预期的吗 gt z lt data table c1 sample 1 1000 1000 replace T
  • 在 TeamCity 中全局禁用 FxCop 错误

    好的 今天还有一个 FxCop 问题 我已经阅读了有关 IdentifiersShouldBeCasedCorrectly 规则的争论 以及它是否应该是 XML 或 Xml 嗯 我是一个 XML 人 并且我想保持这种状态 因此 我做not希
  • 使用集束搜索实现 seq2seq

    我现在正在实施seq2seq基于示例代码的模型tensorflow提供 我想得到一个top 5解码器进行强化学习的输出 然而 他们用注意力解码器实现了翻译模型 所以我应该实现波束搜索来获取top k结果 现在有一部分代码已实现 该代码被添加
  • 无内存屏障的乱序写入:数据争用的唯一可能原因?

    在经历的同时Java 并发实践 作者 Brian Goetz我遇到了以下行 当一个变量被多个线程读取时 就会发生数据竞争 并由至少一个线程写入 但读取和写入不是按发生之前排序 正确同步的程序之一是 没有数据竞争 正确同步的程序表现出顺序 一
  • 这是 Xamarin Forms 中的内存泄漏吗?

    我遇到了一个问题 页面对象一旦被导航离开 就不会被垃圾收集 我整理了一个非常基本的示例 演示了使用 NavigationPage 和 PushAsync 方法时出现的问题 该页面使用弱引用列表显示 活动 页面的数量 public class
  • tar:错误不可恢复:现在退出

    当我解开教义时 rw r r 1 root root 660252 2010 10 16 23 06 Doctrine 1 2 0 tgz 我总是收到此错误消息 root X100e usr local lib Doctrine stabl
  • 何时在带有react-dom的jest单元测试中使用act()

    根据反应单元测试文档 act 要为断言准备组件 请包装代码渲染 它并在 act 调用中执行更新 这使得你的测试 运行起来更接近 React 在浏览器中的工作方式 但测试在这两种情况下都运行得很好 没有 act it Should retur
  • Linux堆栈的动态扩展

    我注意到 Linux 堆栈开始时很小 然后由于递归 推送 vlas 达到大小而导致页面错误而扩展getrlimit RLIMIT STACK 给予或接受 在我的系统上默认为 8MiB 但奇怪的是 如果我通过直接寻址字节来导致页面错误 在限制
  • 如何将 Web 服务绑定到特定 glassfish 端口?

    I have Glassfish 3 1 1 Metro JAX WS stack 在我的域的虚拟服务器中安装多个 http 侦听器 当我部署 EAR 时 Web 应用程序和肥皂服务都绑定到所有可用的 http 侦听器 而我希望它们由不同的
  • Gas .org 与 nasm 中的 ORG 不同吗?

    我使用 gnu 作为简单的启动 是这样的 text org 0x7c00 start movw 0x7c0 ax movw ax ds movw ax es leaw greeting msg si call prtstr end fill
  • Task.Result 与 .GetAwaiter.GetResult() 相同吗?

    我最近正在阅读一些使用大量异步方法的代码 但有时需要同步执行它们 该代码的作用是 Foo foo GetFooAsync GetAwaiter GetResult 这是否与 Foo foo GetFooAsync Result Task G
  • 通过 ADB 更改设备语言

    我想通过 ADB 更改语言 我尝试 adb shell setprop persist sys language fr setprop persist sys country CA stop sleep 5 start 但我收到错误 set
  • 如何在 Node js 中使用 module.exports 导出数组?

    我有一个使用node js 的项目 这是我第一次使用nodejs 我想将数组导出到我的应用程序 这是一些代码 module exports var arrays arrays 0 array 0 arrays 1 array 1 array
  • 为什么 easeljs stage.getBounds() 返回 null?

    在这个例子中 var canvas document getElementById testCanvas var stage new createjs Stage canvas function drawRectangle var rect
  • 当我们在键盘上键入时,如何使字符串的内容显示在屏幕上?

    我有这个功能 玩家可以输入他的名字 但我希望每个字母在他输入时出现在屏幕上 这是我的功能 def input player name player name screen True name win blit player name bg
  • Spring Security,安全访问和非安全访问

    我正在做一个需要先登录的小应用程序 但对于某些第三方工具 我想提供一个不需要登录的API 登录本身工作正常 API 本身工作正常 但我不知道如何告诉 Spring Security 无需身份验证即可访问 API 我在这里和其他网站上检查了几