标签: spring-security

Spring MVC的DelegatingFilterProxy有什么意义?

我在我的Spring MVC应用程序中看到了这个web.xml:

<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
Run Code Online (Sandbox Code Playgroud)

我试图找出它为什么存在以及它是否真的需要它.

在Spring文档中找到了这个解释,但它无助于我理解它:

它似乎表明这个组件是定义的servlet web.xml和Spring中定义的组件之间的"粘合剂" applicationContext.xml.

7.1 DelegatingFilterProxy

当使用servlet过滤器时,你显然需要在你的声明中声明它们web.xml,否则它们将被servlet容器忽略.在Spring Security中,过滤器类也是在应用程序上下文中定义的Spring bean,因此能够利用Spring丰富的依赖注入工具和生命周期接口.Spring DelegatingFilterProxy提供web.xml了应用程序上下文之间的链接.

使用DelegatingFilterProxy时,您将在web.xml文件中看到类似的内容:

<filter>
   <filter-name>myFilter</filter-name>
   <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
   <filter-name>myFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>
Run Code Online (Sandbox Code Playgroud)

请注意,过滤器实际上是a DelegatingFilterProxy,而不是实际实现过滤器逻辑的类.什么DelegatingFilterProxy是将Filter的方法委托给从Spring应用程序上下文获得的bean.这使bean能够受益于Spring Web应用程序上下文生命周期支持和配置灵活性.bean必须实现javax.servlet.Filter,并且必须与filter-name元素中的名称相同.有关更多信息,请阅读DelegatingFilterProxyJavadoc

所以,如果我把它从我web.xml身上拿走,会发生什么?我的servlet无法与Spring容器通信?**

java spring spring-mvc spring-security

116
推荐指数
5
解决办法
7万
查看次数

如何使用Spring Security检查Java代码中的"hasRole"?

如何检查Java代码中的用户权限或权限?例如 - 我想根据角色为用户显示或隐藏按钮.有注释,如:

@PreAuthorize("hasRole('ROLE_USER')")
Run Code Online (Sandbox Code Playgroud)

如何在Java代码中创建它?就像是 :

if(somethingHere.hasRole("ROLE_MANAGER")) {
   layout.addComponent(new Button("Edit users"));
}
Run Code Online (Sandbox Code Playgroud)

java spring-security user-roles

113
推荐指数
10
解决办法
15万
查看次数

Spring Security Filter Chain的工作原理

我意识到Spring安全性构建在过滤器链上,它将拦截请求,检测(缺少)身份验证,重定向到身份验证入口点或将请求传递给授权服务,并最终让请求命中servlet或抛出安全性异常(未经认证或未经授权).DelegatingFitlerProxy将这些过滤器粘合在一起.为了执行他们的任务,这些过滤器访问服务,例如UserDetailsS​​erviceAuthenticationManager.

链中的关键过滤器(按顺序)

  • SecurityContextPersistenceFilter(从JSESSIONID恢复身份验证)
  • UsernamePasswordAuthenticationFilter(执行身份验证)
  • ExceptionTranslationFilter(从FilterSecurityInterceptor捕获安全性异常)
  • FilterSecurityInterceptor(可能会抛出身份验证和授权异常)

我很困惑如何使用这些过滤器.对于弹簧提供的form-login,UsernamePasswordAuthenticationFilter仅用于/ login,而后者的过滤器不是?form-login名称空间元素是否自动配置这些过滤器?是否每个请求(已验证或未验证)都会到达非登录URL的FilterSecurityInterceptor

如果我想使用从登录检索的JWT令牌来保护我的REST API ,该怎么办?我必须配置两个命名空间配置http标签,权限?另一个用于/ login with UsernamePasswordAuthenticationFilter,另一个用于REST url,带有自定义JwtAuthenticationFilter.

配置两个http元素会创建两个springSecurityFitlerChains吗?是UsernamePasswordAuthenticationFilter默认是关闭的,直到我宣布form-login?如何更换SecurityContextPersistenceFilter一个,Authentication从现有JWT-token而不是JSESSIONID

authentication spring filter spring-security jwt

113
推荐指数
3
解决办法
9万
查看次数

Spring Security:升级 Spring Boot 2.7.0 中已弃用的 WebSecurityConfigurerAdapter

我正在尝试更新它,WebSecurityConfigurerAdapter因为它已被弃用。该类配置如下:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    UsuariService userDetailsService;

    @Autowired
    private AuthEntryPointJwt unauthorizedHandler;
    
    @Bean
    public AuthTokenFilter authenticationJwtTokenFilter() {
        return new AuthTokenFilter();
    }

    @Override
    public void configure(AuthenticationManagerBuilder authenticationManagerBuilder) throws Exception {
        authenticationManagerBuilder.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
    }

    @Bean
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.cors().and().csrf().disable().exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and()
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and().authorizeRequests()
                .antMatchers("/api/auth/**").permitAll().antMatchers("/api/test/**").permitAll().antMatchers("/api/v1/**").permitAll().anyRequest()
                .authenticated();

        http.addFilterBefore(authenticationJwtTokenFilter(), UsernamePasswordAuthenticationFilter.class);
    }

}
Run Code Online (Sandbox Code Playgroud)

现在没有了WebSecurityConfigurerAdapter我重新定义同一个类,如下所示:

@Configuration …
Run Code Online (Sandbox Code Playgroud)

spring-security spring-boot

107
推荐指数
4
解决办法
19万
查看次数

如何在Spring Security/SpringMVC中手动设置经过身份验证的用户

在新用户提交"新帐户"表单后,我想手动将该用户登录,这样他们就不必在后续页面上登录.

通过spring安全拦截器的普通表单登录页面工作得很好.

在新帐户形式的控制器中,我正在创建UsernamePasswordAuthenticationToken并手动在SecurityContext中设置它:

SecurityContextHolder.getContext().setAuthentication(authentication);
Run Code Online (Sandbox Code Playgroud)

在同一页面上,我稍后检查用户是否已登录:

SecurityContextHolder.getContext().getAuthentication().getAuthorities();
Run Code Online (Sandbox Code Playgroud)

这将返回我之前在身份验证中设置的权限.一切都很好.

但是当我加载的下一页上调用相同的代码时,身份验证令牌就是UserAnonymous.

我不清楚为什么它没有保留我在上一个请求中设置的身份验证.有什么想法吗?

  • 是否与会话ID未正确设置有关?
  • 有什么东西可能会以某种方式覆盖我的身份验证吗?
  • 也许我只需要另一步来保存身份验证?
  • 或者我需要做些什么才能在整个会话中声明身份验证而不是单个请求?

只是寻找一些可能有助于我了解这里发生了什么的想法.

java authentication spring-mvc spring-security

102
推荐指数
5
解决办法
16万
查看次数

HttpSecurity,WebSecurity和AuthenticationManagerBuilder

任何人都可以解释何时覆盖configure(HttpSecurity),configure(WebSecurity)configure(AuthenticationManagerBuilder)

java spring spring-mvc spring-security

95
推荐指数
2
解决办法
2万
查看次数

如何在没有会话的情况下使用Spring Security?

我正在使用Spring Security构建一个Web应用程序,该应用程序将存在于Amazon EC2上并使用Amazon的Elastic Load Balancers.不幸的是,ELB不支持粘性会话,因此我需要确保我的应用程序在没有会话的情况下正常工作.

到目前为止,我已经设置了RememberMeServices来通过cookie分配令牌,这很好用,但我希望cookie随浏览器会话一起过期(例如当浏览器关闭时).

我不得不想象我不是第一个想要在没有会话的情况下使用Spring Security的人......有什么建议吗?

spring load-balancing spring-security amazon-ec2

94
推荐指数
5
解决办法
7万
查看次数

如何创建用于spring安全表达式语言注释的自定义方法

我想创建一个类,添加自定义方法,以便在spring安全表达式语言中通过注释进行基于方法的授权.

例如,我想创建一个像'customMethodReturningBoolean'这样的自定义方法,以某种方式使用:

  @PreAuthorize("customMethodReturningBoolean()")
  public void myMethodToSecure() { 
    // whatever
  }
Run Code Online (Sandbox Code Playgroud)

我的问题是这个.如果可能,我应该创建自定义方法的子类,我将如何在spring xml配置文件中配置它,并且有人给我一个以这​​种方式使用的自定义方法的示例?

java spring spring-security

89
推荐指数
3
解决办法
6万
查看次数

在请求参数'_csrf'或标题'X-CSRF-TOKEN'上找到无效的CSRF令牌'null'

配置Spring Security 3.2后,_csrf.token不会绑定请求或会话对象.

这是spring security配置:

<http pattern="/login.jsp" security="none"/>

<http>
    <intercept-url pattern="/**" access="ROLE_USER"/>
    <form-login login-page="/login.jsp"
                authentication-failure-url="/login.jsp?error=1"
                default-target-url="/index.jsp"/>
    <logout/>
    <csrf />
</http>

<authentication-manager>
    <authentication-provider>
        <user-service>
            <user name="test" password="test" authorities="ROLE_USER/>
        </user-service>
    </authentication-provider>
</authentication-manager>
Run Code Online (Sandbox Code Playgroud)

login.jsp文件

<form name="f" action="${contextPath}/j_spring_security_check" method="post" >
    <input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}" />
    <button id="ingresarButton"
            name="submit"
            type="submit"
            class="right"
            style="margin-right: 10px;">Ingresar</button>
    <span>
        <label for="usuario">Usuario :</label>
        <input type="text" name="j_username" id="u" class="" value=''/>
    </span>
    <span>
        <label for="clave">Contrase&ntilde;a :</label>

        <input type="password"
               name="j_password"
               id="p"
               class=""
               onfocus="vc_psfocus = 1;"
               value="">
    </span>
</form>
Run Code Online (Sandbox Code Playgroud)

它呈现下一个HTML:

<input type="hidden" name="" …
Run Code Online (Sandbox Code Playgroud)

spring csrf spring-security csrf-protection

88
推荐指数
7
解决办法
13万
查看次数

如何在Spring中获取Session对象?

我对Spring和Spring安全性比较陌生.

我试图编写一个程序,我需要使用Spring安全性在服务器端验证用户,

我想出了以下内容:

public class CustomAuthenticationProvider extends AbstractUserDetailsAuthenticationProvider{
    @Override
    protected void additionalAuthenticationChecks(UserDetails userDetails, UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken)
                    throws AuthenticationException
    {
        System.out.println("Method invoked : additionalAuthenticationChecks isAuthenticated ? :"+usernamePasswordAuthenticationToken.isAuthenticated());
    }

    @Override
    protected UserDetails retrieveUser(String username,UsernamePasswordAuthenticationToken authentication) throws AuthenticationException 
    {
        System.out.println("Method invoked : retrieveUser");
        //so far so good, i can authenticate user here, and throw exception if not authenticated!!
        //THIS IS WHERE I WANT TO ACCESS SESSION OBJECT
    }
}
Run Code Online (Sandbox Code Playgroud)

我的用例是,当用户通过身份验证时,我需要放置一个属性,如:

session.setAttribute("userObject", myUserObject);
Run Code Online (Sandbox Code Playgroud)

myUserObject是某个类的对象,我可以跨多个用户请求访问整个服务器代码.

spring spring-mvc spring-security

83
推荐指数
3
解决办法
17万
查看次数