首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >弹簧安全,安全且无安全访问

弹簧安全,安全且无安全访问
EN

Stack Overflow用户
提问于 2016-08-20 09:17:14
回答 1查看 1.8K关注 0票数 2

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

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

代码语言:javascript
复制
/**
 * 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();
}

我的控制器:

代码语言:javascript
复制
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!";
    }
}

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-20 20:05:48

请参阅弹簧安全参考

我们的示例只要求用户进行身份验证,并且已经对应用程序中的每个URL进行了身份验证。我们可以通过向http.authorizeRequests()方法中添加多个子元素来为URL指定自定义需求。例如: 受保护的空配置(HttpSecurity http)引发异常{ http .authorizeRequests() .antMatchers("/resources/**“)、"/signup”、"/about").permitAll() .antMatchers("/admin/**").hasRole("ADMIN") .hasRole和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()将覆盖第一次使用。

还请参见AntPathMatcher

映射使用以下规则匹配URL: ?匹配一个字符 *匹配零或多个字符 **匹配路径中的零或多个目录。 示例 com/t?st.jsp -匹配com/test.jsp,但也匹配com/tast.jspcom/txst.jsp com/*.jsp -匹配com目录中的所有.jsp文件 com/**/test.jsp -匹配com路径下的所有test.jsp文件 org/springframework/**/*.jsp -匹配org/springframework路径下的所有.jsp文件 org/**/servlet/bla.jsp -匹配org/springframework/servlet/bla.jsp,但也匹配org/springframework/testing/servlet/bla.jsporg/servlet/bla.jsp

修改后的代码:

代码语言:javascript
复制
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();
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39052457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档