Spring Security HTTP Basic for RESTFul 和 FormLogin (Cookies) for web - 注释
Posted
技术标签:
【中文标题】Spring Security HTTP Basic for RESTFul 和 FormLogin (Cookies) for web - 注释【英文标题】:Spring Security HTTP Basic for RESTFul and FormLogin (Cookies) for web - Annotations 【发布时间】:2015-03-02 16:59:52 【问题描述】:具体
我只想对特定的 URL 模式进行 HTTP 基本身份验证。
详细说明
我正在为我的应用程序创建一个 API 接口,它需要通过简单的 HTTP 基本身份验证 进行身份验证。但其他网页应该不使用 HTTP basic,而是使用 普通表单登录。
当前配置 - 不工作
@Override
protected void configure(HttpSecurity http) throws Exception
http //HTTP Security
.csrf().disable() //Disable CSRF
.authorizeRequests() //Authorize Request Configuration
.antMatchers("/connect/**").permitAll()
.antMatchers("/", "/register").permitAll()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/api/**").hasRole("API")
.anyRequest().authenticated()
.and() //HTTP basic Authentication only for API
.antMatcher("/api/**").httpBasic()
.and() //Login Form configuration for all others
.formLogin().loginPage("/login").permitAll()
.and() //Logout Form configuration
.logout().permitAll();
【问题讨论】:
【参考方案1】:等了 2 天,在这里没有得到任何帮助。但我的研究为我提供了一个解决方案:)
解决方案
@Configuration
@EnableWebMvcSecurity
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true, proxyTargetClass = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter
@Autowired
private AuthenticationProvider authenticationProvider;
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception
auth.authenticationProvider(authenticationProvider);
@Configuration
@Order(1)
public static class ApiWebSecurityConfig extends WebSecurityConfigurerAdapter
@Override
protected void configure(HttpSecurity http) throws Exception
http.csrf().disable()
.antMatcher("/api/**")
.authorizeRequests()
.anyRequest().hasAnyRole("ADMIN", "API")
.and()
.httpBasic();
@Configuration
@Order(2)
public static class FormWebSecurityConfig extends WebSecurityConfigurerAdapter
@Override
public void configure(WebSecurity web) throws Exception
web.ignoring().antMatchers("/css/**", "/js/**", "/img/**", "/lib/**");
@Override
protected void configure(HttpSecurity http) throws Exception
http.csrf().disable() //HTTP with Disable CSRF
.authorizeRequests() //Authorize Request Configuration
.antMatchers("/connect/**").permitAll()
.antMatchers("/", "/register").permitAll()
.antMatchers("/admin/**").hasRole("ADMIN")
.anyRequest().authenticated()
.and() //Login Form configuration for all others
.formLogin()
.loginPage("/login").permitAll()
.and() //Logout Form configuration
.logout().permitAll();
【讨论】:
如何删除基本的 http auth 弹出窗口。我已经尝试了一切,但无法这样做。 不要使用httpBasic,使用formLogin。 试过没有成功,我通过httpBasic().disable()禁用它并使用formLogin(),但似乎没有修复。 在单独的问题中发布您的代码并放置链接。不要忘记将您的配置源代码放入其中。 为什么要用@Order注解?【参考方案2】:我不知道它是否有帮助,但我无法实施上述解决方案。我找到了定义单个安全性的解决方法
@配置类
扩展
WebSecurityConfigurerAdapter
同时配置了 httpBasic() 和 formLogin()。然后我创建了一个自定义
CustomAuthEntryPoint 实现 AuthenticationEntryPoint
在开始方法中有这个逻辑:
@Override
public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException
String urlContext = UtilityClass.extractUrlContext(request);
if (!urlContext.equals(API_URL_PREFIX))
String redirectUrl = "urlOfFormLogin"
response.sendRedirect(request.getContextPath() + redirectUrl);
else
response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
不知道关于这个问题的“最佳实践策略”是什么
【讨论】:
以上是关于Spring Security HTTP Basic for RESTFul 和 FormLogin (Cookies) for web - 注释的主要内容,如果未能解决你的问题,请参考以下文章