我已经建立了一个完全工作的Spring Security流程,其中一些路径需要验证(通过令牌),而其他路径我希望保持开放和可访问,而不需要令牌。我遇到的问题是,当一个请求没有authorization
头而进入其中一个开放路径时,筛选器将被忽略,并生成正确的响应。但是,当authorization
头存在时,即使在忽略的路径上,请求也会通过整个安全筛选器链,而理想的过程是完全跳过筛选器链。
下面是我的配置。
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring()
.antMatchers(DEFAULT_IGNORE_REQUESTS);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
authenticationTokenHeaderFilter.setAuthenticationManager(authenticationManager);
http.authorizeRequests()
.antMatchers("/example/**")
.authenticated()
.and()
.exceptionHandling()
.accessDeniedHandler((request, response, accessDeniedException) -> {
response.sendError(HttpServletResponse.SC_FORBIDDEN, accessDeniedException.getMessage());
})
.authenticationEntryPoint(new HttpAuthenticationEntryPoint())
.and()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.cors()
.and()
.csrf().disable()
.addFilter(authenticationTokenHeaderFilter)
.addFilterBefore(new ExceptionTranslationFilter(
new Http403ForbiddenEntryPoint()),
authenticationTokenHeaderFilter.getClass()
);
}
public class AuthenticationTokenHeaderFilter extends AbstractPreAuthenticatedProcessingFilter {
@Override
protected Object getPreAuthenticatedPrincipal(HttpServletRequest httpServletRequest) {
return httpServletRequest.getHeader(HttpHeaders.AUTHORIZATION);
}
@Override
protected Object getPreAuthenticatedCredentials(HttpServletRequest httpServletRequest) {
return "N/A";
}
@Override
@Autowired
public void setAuthenticationManager(AuthenticationManager authenticationManager) {
super.setAuthenticationManager(authenticationManager);
}
}
此外,我还尝试使用PermitAll()
将忽略的路径放入HttpSecurity
中,但没有成功。
String[] DEFAULT_IGNORE_REQUESTS = new String[]{ "/actuator" };
当我在没有authorization
头的情况下发出请求时,不会调用安全链。当我发出具有authorization
头的请求时,将调用安全链并验证authorization
值(令牌)。在令牌无效的情况下,将在筛选器内抛出一个自定义异常。即使抛出了错误,我还是从/acture
得到了预期的响应,结果是200。但是,在这种情况下,抛出的错误会被记录下来,并生成堆栈跟踪,我不希望这样做,因为在这种情况下它不是错误。
在Spring Boot中,任何filter
类型的@bean
都将作为servlet过滤器添加。最有可能发生的情况是,您的过滤器被添加为一个完全独立于过滤器链的过滤器。
您可以在WebSecurityConfigurerAdapter
中初始化AuthenticationTokenHeaderFilter
,并直接设置AuthenticationManager
,而不是将过滤器声明为@bean
(您已经这样做了)。因此可以删除筛选器中的@autowired
批注。
我有一个通过JWT进行身份验证的Spring Boot REST API。我的问题是,我已经将Spring Security配置为允许不受限制地访问用于对进行身份验证的路径,但它仍然在不应该访问的情况下访问我的安全过滤器。我不知道我哪里错了任何忠告都是恰当的
问题内容: 我正在编写一个使用Oracle JDBC驱动程序的Java程序。我已经在我的类路径中设置了它。当我在IDE中运行程序(作为jdbc作为库添加)时,程序运行正常。当我尝试部署它时,它完全忽略了classpath中的清单,并给了我一个NoClassDefFoundError。 我想使用客户端的JDBC驱动程序(已安装的JDBC驱动程序),并且不提供自己的驱动程序。我打包了来自JDevelo
我的Spring安全配置如下: 我只包括了spring security,而不是oauth2。由于某些原因,如果有人使用授权头访问任何允许的url,例如/rest/app/health,他将获得401未授权。没有头部的情况下工作正常。 我怎么能忽略授权头,因为我需要这个头作为请求参数来将我的请求委托给第三方服务。
基于路径的授权 Apache和svnserve都可以给用户赋予(或拒绝)访问许可,通常是对整个版本库:一个用户可以读版本库(或不),而且他可以写版本库(或不)。如果可能,也可以定义细粒度的访问规则。一组用户可以有版本库的一个目录的读写权限,但是没有其它的;另一个目录可以是只对一少部分用户可读。 两种服务器都使用同样的文件格式描述路径为基础的规则,如果是Apache,需要加载mod_authz_sv
我正在做一个DevOps练习,其中我在Azure DevOps Repo(一个项目一个文件夹)中维护不同项目的代码。需要为所有人创建单个发布管道。 我试图创建一个发布管道,在这里我使用工件源作为DevOps repo(因为我直接部署ARM模板,它不需要构建)。现在,我需要为特定ARM文件夹中的更改触发发布(即,如果对项目2进行了更改)。如果我在项目1中进行更改,则不应触发它。 我怎样才能做到呢?
JNA还加载正确的库。 这里有人知道为什么不起作用吗?是因为我使用的是带有清单的jar应用程序文件吗? 有人有类似的问题吗?