我根据基本和基于表单的身份验证配置了spring-security auto-config='true'.
我希望端点/api/**不使用基于表单的安全性.外部的其他端点/api/**应使用基于表单的登录.我想401发送一个响应,发送给这些没有提供凭据的端点/api/**.
更新:感谢Luke Taylor在下面的评论,我提出了以下解决方案.
注意:此技术仅适用于spring-security 3.1.
首先我单挑/api/**.我们从不创建一个会话虽然使用一个如果可用,这是由处理create-session="never"和使用<session-management/>.
<http pattern="/api/**" create-session="never" use-expressions="true">
<http-basic />
<session-management />
<intercept-url pattern="/api/**" access="hasRole('API_ACCESS')"/>
</http>
<http auto-config="true" use-expressions="true">
<intercept-url pattern="/" access="permitAll"/>
<intercept-url pattern="/**" access="isAuthenticated()"/>
</http>
Run Code Online (Sandbox Code Playgroud) 我在我的应用程序Spring控制器中实现了Spring Security Expression:
@Controller
@RequestMapping("init")
public class InitController {
@PreAuthorize("hasRole('ROLE_ADMIN')")
@RequestMapping(value = "/", method = RequestMethod.GET)
public @ResponseBody String home(){
return "This is the init page";
}
}
Run Code Online (Sandbox Code Playgroud)
使用此安全配置:
<http auto-config="true" create-session="stateless" use-expressions="true">
<intercept-url pattern="/_ah*" access="permitAll" />
<intercept-url pattern="/init/*" access="hasRole('ROLE_ADMIN')"/>
<intercept-url pattern="/init*" access="hasRole('ROLE_ADMIN')"/>
</http>
Run Code Online (Sandbox Code Playgroud)
当访问此资源时,将显示默认的Spring登录表单(http://localhost:8888/spring_security_login)但是我不希望这种情况发生,并且我只想将凭据插入请求标头中,如"x-authorization-key"或其他适合这种情况.
这有什么可能的解决方案?
头
我想使用 OAuth 2 通过 Spring Security 保护我的应用程序。但是,我不希望服务器重定向传入的未经授权的请求,而是使用 HTTP 401 进行响应。这可能吗?
示例:此代码将请求重定向到默认登录页面。
应用程序属性
spring.security.oauth2.client.registration.google.client-id=...
spring.security.oauth2.client.registration.google.client-secret=...
Run Code Online (Sandbox Code Playgroud)
验证配置文件
@Configuration
public class AuthConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/secured/**").authenticated()
.anyRequest().permitAll()
.and()
.oauth2Login();
// /sf/ask/2220020981/
// deos not work
// .and()
// .formLogin().successHandler((request, response, authentication) -> {});
}
}
Run Code Online (Sandbox Code Playgroud)