javascript

git

python

java

github

django

c#

reactjs

loops

git-remote

terminology

list

local-storage

pandas

performance

system.out

git-reset

regex

email

string-parsing

java-在JSP EL表达式中获取Spring Security Principal

我正在使用Spring MVC和Spring Security版本3.0.6.RELEASE。 在我的JSP中获取用户名的最简单方法是什么? 甚至只是用户是否已登录? 我可以想到几种方法:

1.使用脚本

使用如下脚本来确定用户是否已登录:

<%=org.springframework.security.core.context.SecurityContextHolder.getContext()
    .getAuthentication().getPrincipal().equals("anonymousUser")
    ? "false":"true"%>

不过,我不喜欢使用scriptlet,我想在一些@Controller标签中使用它,这需要将其作为页面属性放回去。

2.使用SecurityContextHolder

我可以再次使用@Controller中的SecurityContextHolder并将其放在模型上。 不过,我在每个页面上都需要此逻辑,因此我宁愿不必在每个Controller中都添加此逻辑。

我怀疑有更干净的方法可以做到这一点...

trans by 2020-08-10T13:18:58Z

java-如何通过Spring安全性有条件地向登录用户显示jsp内容

我想向任何已登录的用户显示内容,并在未登录的情况下隐藏它们。我正在使用jsp和spring安全性。

显然,自行解决方案很容易做到。 但是实现这一目标的最干净的标准方法是什么?

Spring安全性标签似乎没有很好的方法来允许将来添加新角色。

trans by 2020-08-09T05:22:12Z

rest-Spring Security-基于令牌的API身份验证和用户/密码身份验证

我正在尝试创建一个主要使用Spring提供REST API的webapp,并试图配置安全性。

我正在尝试实现这种模式:[https://developers.google.com/accounts/docs/MobileApps](Google完全更改了该页面,因此不再有意义-请参阅我在此处引用的页面: [http://web.archive.org/web/20130822184827/https://developers.google.com/accounts/docs/MobileApps)]

这是我需要完成的工作:

  • Web应用程序具有简单的登录/注册表单,可用于普通的spring用户/密码身份验证(之前使用dao / authenticationmanager / userdetailsservice等完成了此类操作)
  • REST API端点是无状态会话,并且每个请求都基于与请求一起提供的令牌进行身份验证

(例如,用户使用常规形式登录/注册,webapp提供带有令牌的安全cookie,然后可在随后的API请求中使用该令牌)

我有一个正常的身份验证设置,如下所示:

@Override protected void configure(HttpSecurity http) throws Exception {
    http
        .csrf()
            .disable()
        .authorizeRequests()
            .antMatchers("/resources/**").permitAll()
            .antMatchers("/mobile/app/sign-up").permitAll()
            .antMatchers("/v1/**").permitAll()
            .anyRequest().authenticated()
            .and()
        .formLogin()
            .loginPage("/")
            .loginProcessingUrl("/loginprocess")
            .failureUrl("/?loginFailure=true")
            .permitAll();
}

我当时正在考虑添加一个预身份验证过滤器,该过滤器会检查请求中的令牌,然后设置安全上下文(这是否意味着将跳过正常的后续身份验证?),但是,我所拥有的权限超出了普通用户/密码 基于令牌的安全性并没有做太多,但是基于其他一些示例,我想到了以下内容:

安全配置:

@Override protected void configure(HttpSecurity http) throws Exception {
        http
            .csrf()
                .disable()
            .addFilter(restAuthenticationFilter())
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
                .exceptionHandling().authenticationEntryPoint(new Http403ForbiddenEntryPoint()).and()
                .antMatcher("/v1/**")
            .authorizeRequests()
                .antMatchers("/resources/**").permitAll()
                .antMatchers("/mobile/app/sign-up").permitAll()
                .antMatchers("/v1/**").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/")
                .loginProcessingUrl("/loginprocess")
                .failureUrl("/?loginFailure=true")
                .permitAll();
    }

我的自定义休息过滤器:

public class RestAuthenticationFilter extends AbstractAuthenticationProcessingFilter {

    public RestAuthenticationFilter(String defaultFilterProcessesUrl) {
        super(defaultFilterProcessesUrl);
    }

    private final String HEADER_SECURITY_TOKEN = "X-Token"; 
    private String token = "";


    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;

        this.token = request.getHeader(HEADER_SECURITY_TOKEN);

        //If we have already applied this filter - not sure how that would happen? - then just continue chain
        if (request.getAttribute(FILTER_APPLIED) != null) {
            chain.doFilter(request, response);
            return;
        }

        //Now mark request as completing this filter
        request.setAttribute(FILTER_APPLIED, Boolean.TRUE);

        //Attempt to authenticate
        Authentication authResult;
        authResult = attemptAuthentication(request, response);
        if (authResult == null) {
            unsuccessfulAuthentication(request, response, new LockedException("Forbidden"));
        } else {
            successfulAuthentication(request, response, chain, authResult);
        }
    }

    /**
     * Attempt to authenticate request - basically just pass over to another method to authenticate request headers 
     */
    @Override public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException, IOException, ServletException {
        AbstractAuthenticationToken userAuthenticationToken = authUserByToken();
        if(userAuthenticationToken == null) throw new AuthenticationServiceException(MessageFormat.format("Error | {0}", "Bad Token"));
        return userAuthenticationToken;
    }


    /**
     * authenticate the user based on token, mobile app secret & user agent
     * @return
     */
    private AbstractAuthenticationToken authUserByToken() {
        AbstractAuthenticationToken authToken = null;
        try {
            // TODO - just return null - always fail auth just to test spring setup ok
            return null;
        } catch (Exception e) {
            logger.error("Authenticate user by token error: ", e);
        }
        return authToken;
    }

上面的结果实际上导致应用启动时出错:authenticationManager must be specified谁能告诉我最好的方法-pre_auth过滤器是执行此操作的最佳方法吗?


编辑

我写下了发现的内容以及如何使用Spring-security(包括代码)来实现标准令牌实现(不是OAuth)

问题和方法/解决方案概述

使用Spring-security实施解决方案

希望对其他人有所帮助。

trans by 2020-07-28T19:42:54Z

java-如何使用<sec:authorize access =“ hasRole('ROLES)”>检查多个角色?

我想使用Spring Security JSP标签库根据角色有条件地显示一些内容。但是在Spring Security 3.1.x中,仅检查一个角色。

我可以使用,但是ifAllGranted已弃用。

有什么帮助吗?

trans by 2020-07-26T22:09:08Z

基于Spring的SockJS / STOMP Web的JSON Web令牌(JWT)

背景

我正在使用Spring Boot(1.3.0.BUILD-SNAPSHOT)设置一个RESTful Web应用程序,该应用程序包括一个STOMP / SockJS WebSocket,我打算从iOS应用程序和Web浏览器中使用它。 我想使用JSON Web令牌(JWT)来保护REST请求和WebSocket接口,但使用后者却遇到了困难。

该应用程序受Spring Security保护:-

@Configuration
@EnableWebSecurity
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {

    public WebSecurityConfiguration() {
        super(true);
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .withUser("steve").password("steve").roles("USER");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .exceptionHandling().and()
            .anonymous().and()
            .servletApi().and()
            .headers().cacheControl().and().and()

            // Relax CSRF on the WebSocket due to needing direct access from apps
            .csrf().ignoringAntMatchers("/ws/**").and()

            .authorizeRequests()

            //allow anonymous resource requests
            .antMatchers("/", "/index.html").permitAll()
            .antMatchers("/resources/**").permitAll()

            //allow anonymous POSTs to JWT
            .antMatchers(HttpMethod.POST, "/rest/jwt/token").permitAll()

            // Allow anonymous access to websocket 
            .antMatchers("/ws/**").permitAll()

            //all other request need to be authenticated
            .anyRequest().hasRole("USER").and()

            // Custom authentication on requests to /rest/jwt/token
            .addFilterBefore(new JWTLoginFilter("/rest/jwt/token", authenticationManagerBean()), UsernamePasswordAuthenticationFilter.class)

            // Custom JWT based authentication
            .addFilterBefore(new JWTTokenFilter(), UsernamePasswordAuthenticationFilter.class);
    }

}

WebSocket配置是标准配置:

@Configuration
@EnableScheduling
@EnableWebSocketMessageBroker
public class WebSocketConfiguration extends AbstractWebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/topic");
        config.setApplicationDestinationPrefixes("/app");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/ws").withSockJS();
    }

}

我还有一个子类AbstractSecurityWebSocketMessageBrokerConfigurer以保护WebSocket:-

@Configuration
public class WebSocketSecurityConfiguration extends AbstractSecurityWebSocketMessageBrokerConfigurer {

    @Override
    protected void configureInbound(MessageSecurityMetadataSourceRegistry messages) {
        messages.anyMessage().hasRole("USER");
    }

    @Override
    protected boolean sameOriginDisabled() {
        // We need to access this directly from apps, so can't do cross-site checks
        return true;
    }

}

还有一些AbstractSecurityWebSocketMessageBrokerConfigurer带注释的类可以处理各种功能,并且通过我的WebSecurityConfiguration类中注册的JWTTokenFilter成功地保护了这些类。

问题

但是我似乎无法用JWT保护WebSocket。 我在浏览器中使用SockJS 1.1.0和STOMP 1.7.1,无法弄清楚如何传递令牌。 看来SockJS不允许使用初始AbstractSecurityWebSocketMessageBrokerConfigurer和/或握手请求发送参数。

Spring Security for WebSockets文档指出AbstractSecurityWebSocketMessageBrokerConfigurer确保:

任何入站CONNECT消息均需要有效的CSRF令牌来实施“同源起点策略”

这似乎暗示着初始握手应该是不安全的,并且在接收到STOMP CONNECT消息时将调用身份验证。 不幸的是,我似乎找不到任何有关执行此操作的信息。 另外,此方法将需要其他逻辑来断开打开WebSocket连接且从不发送STOMP CONNECT的流氓客户端的连接。

作为Spring的(新手)我也不确定Spring Sessions是否适合于此。 虽然文档非常详细,但似乎没有一个很好的,简单的(又称白痴)指南来说明各个组件如何组合在一起/如何相互影响。

如何通过提供JSON Web令牌(最好是在握手时)来保护SockJS WebSocket(甚至有可能)?

trans by 2020-07-26T17:18:55Z

javascript-如何在Spring Boot + Spring Security应用程序中配置CORS?

我将Spring Boot与Spring Security和Cors支持一起使用。

如果我执行以下代码

url = 'http://localhost:5000/api/token'
xmlhttp = new XMLHttpRequest
xmlhttp.onreadystatechange = ->
    if xmlhttp.readyState is 4
        console.log xmlhttp.status
xmlhttp.open "GET", url, true
# xmlhttp.setRequestHeader "X-Requested-With", "XMLHttpRequest"
xmlhttp.setRequestHeader 'Authorization', 'Basic ' + btoa 'a:a'
do xmlhttp.send

结果我得到了

200

如果我使用错误的凭证进行测试,例如

url = 'http://localhost:5000/api/token'
xmlhttp = new XMLHttpRequest
xmlhttp.onreadystatechange = ->
    if xmlhttp.readyState is 4
        console.log xmlhttp.status
xmlhttp.open "GET", url, true
# xmlhttp.setRequestHeader "X-Requested-With", "XMLHttpRequest"
xmlhttp.setRequestHeader 'Authorization', 'Basic ' + btoa 'a:aa'
do xmlhttp.send

我得到的不是401(这是Spring安全中错误身份验证的标准代码)

0

带有以下浏览器通知:

GET [http:// localhost:5000 / api / token]

XMLHttpRequest无法加载[http:// localhost:5000。]所请求的资源上没有'Access-Control-Allow-Origin'标头。 因此,不允许访问源'[http:// localhost:3000']。 响应的HTTP状态码为401。

我正在开发前端代码,该代码需要服务器响应中有用的http状态代码来处理这种情况。 我需要比0更有用的东西。而且响应主体为空。 我不知道我的配置是否错误,或者是软件错误,也不知道它在哪里(铬(使用arch linux)或spring security)。

我的Spring配置是:

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

@RestController
@RequestMapping("api")
public class Controller {
    @RequestMapping("token")
    @CrossOrigin
    Map<String, String> token(HttpSession session) {
        return Collections.singletonMap("token", session.getId());
    }
}

@EnableWebSecurity
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().withUser("a").password("a").roles("USER");
    }
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .requestMatchers(CorsUtils::isPreFlightRequest).permitAll()
                .anyRequest().authenticated()
                .and().httpBasic();
    }
}

如果我用curl进行测试,那么一切都可以完美运行,我认为是因为不需要CORS支持,但是我尝试用OPTION请求模拟CORS,结果也还可以。

$ curl -v localhost:5000/api/token -H "Authorization: Basic YTpha"
*   Trying ::1...
* Connected to localhost (::1) port 5000 (#0)
> GET /api/token HTTP/1.1
> Host: localhost:5000
> User-Agent: curl/7.48.0
> Accept: */*
> Authorization: Basic YTpha
> 
< HTTP/1.1 200 OK
< Server: Apache-Coyote/1.1
< X-Content-Type-Options: nosniff
< X-XSS-Protection: 1; mode=block
< Cache-Control: no-cache, no-store, max-age=0, must-revalidate
< Pragma: no-cache
< Expires: 0
< X-Frame-Options: DENY
< Access-Control-Allow-Origin: http://localhost:3000
< Access-Control-Allow-Methods: POST,GET,OPTIONS,DELETE
< Access-Control-Max-Age: 3600
< Access-Control-Allow-Credentials: true
< Access-Control-Allow-Headers: Origin,Accept,X-Requested-    With,Content-Type,Access-Control-Request-Method,Access-Control-Request-Headers,Authorization
< x-auth-token: 58e4cca9-7719-46c8-9180-2fc16aec8dff
< Content-Type: application/json;charset=UTF-8
< Transfer-Encoding: chunked
< Date: Sun, 01 May 2016 16:15:44 GMT
< 
* Connection #0 to host localhost left intact
{"token":"58e4cca9-7719-46c8-9180-2fc16aec8dff"}

并使用错误的凭据:

$ curl -v localhost:5000/api/token -H "Authorization: Basic YTp"
*   Trying ::1...
* Connected to localhost (::1) port 5000 (#0)
> GET /api/token HTTP/1.1
> Host: localhost:5000
> User-Agent: curl/7.48.0
> Accept: */*
> Authorization: Basic YTp
> 
< HTTP/1.1 401 Unauthorized
< Server: Apache-Coyote/1.1
< X-Content-Type-Options: nosniff
< X-XSS-Protection: 1; mode=block
< Cache-Control: no-cache, no-store, max-age=0, must-revalidate
< Pragma: no-cache
< Expires: 0
< X-Frame-Options: DENY
< WWW-Authenticate: Basic realm="Realm"
< Content-Type: application/json;charset=UTF-8
< Transfer-Encoding: chunked
< Date: Sun, 01 May 2016 16:16:15 GMT
< 
* Connection #0 to host localhost left intact
{"timestamp":1462119375041,"status":401,"error":"Unauthorized","message":"Failed to decode basic authentication token","path":"/api/token"}

编辑:避免误会。 我使用1.3.3 Spring Boot。博客文章写道:

CORS支持将在即将发布的Spring Boot 1.3发行版中提供,并且已在1.3.0.BUILD-SNAPSHOT构建中提供。

在Spring Boot应用程序中使用带有@CrossOrigin批注的控制器方法CORS配置不需要任何特定的配置。

可以通过使用自定义的addCorsMappings(CorsRegistry)方法注册WebMvcConfigurer bean来定义全局CORS配置:

我添加了以下代码以启用全局cors支持。 实际上,我之前曾经尝试过,但是结果是一样的。 我最近再次尝试过,结果是一样的。

@Configuration
public class MyConfiguration {

    @Bean
    public WebMvcConfigurer corsConfigurer() {
        return new WebMvcConfigurerAdapter() {
            @Override
            public void addCorsMappings(CorsRegistry registry) {
                registry.addMapping("/**");
            }
        };
    }
}

问题来自授权过程之间的重定向是一个有趣的想法。 我如何才能更改对任何资源的重定向以避免这种冲突?

编辑:

我想我已经接近解决方案了。 我已经通过添加支持nos的cors的nodejs服务器进行了测试访问控制允许来源:*对所有请求。

就像Stefan Isele已经提到过的那样,似乎Spring安全性重定向或未添加CORS标头,因此这就是请求似乎中断的原因。 因此,在spring安全性检查身份验证的同时,它必须添加适当的标头。

有人知道怎么做吗?

编辑:

我找到了一种解决方法,这似乎很难看。 我已经开始了一个关于spring boot的github问题,我在其中描述了解决方法:[https://github.com/spring-projects/spring-boot/issues/5834]

trans by 2020-07-19T04:16:53Z

spring-获取异常:未定义名为“ springSecurityFilterChain”的bean

我正在从参考资料中学习Spring安全性。 发布3.1.2.RELEASE。 如前所述,我已经像这样配置了security:http标签

security-context.xml

<security:http auto-config="true">
        <security:intercept-url pattern="/**" access="ROLE_USER"/>
    </security:http>

web.xml

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:*-context.xml</param-value>
  </context-param>

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

  <filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

  <servlet>
    <servlet-name>security</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>security</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

security-servlet.xml

<context:component-scan base-package="com.pokuri.security.mvc.controllers"/>

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
        <property name="prefix" value="/WEB-INF/page/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

但是在启动应用程序时出现此异常。 如果我删除安全配置,我的Spring Web应用程序将正常运行。 我在stackoverflow中也遇到了同样的问题。 但是没有运气。

trans by 2020-07-11T05:50:37Z

Spring Security vs Apache Shi

这个问题已经在这里有了答案:

  • Shiro与SpringSecurity的比较 3个答案

到目前为止,我研究的大多数人都说Apache Shiro易于使用并且易于与CAS集成(用于SSO等)。 只是想问问是否有人有使用这两种方法的经验,以及使用哪种方法?为什么一个方法比其他方法更好?

trans by 2020-07-08T22:35:51Z

java-春季安全性allowAll()不允许匿名访问

我有一个方法要同时允许匿名和身份验证访问。

我正在使用基于Java配置的Spring Security 3.2.4。

覆盖的configure方法(在我的自定义配置类中,扩展了WebSecurityConfigurerAdapter)具有以下http块:

    http
        .addFilterBefore(muiltpartFilter, ChannelProcessingFilter.class)
        .addFilterBefore(cf, ChannelProcessingFilter.class)
        .authorizeRequests()
            .anyRequest()
            .authenticated()
            .and()
        .authorizeRequests()
            .antMatchers("/ping**")
            .permitAll()
            .and()
        .formLogin()
            .loginPage("/login")
            .permitAll()
            .and()
        .logout()
            .logoutUrl("/logout")
        .logoutSuccessUrl("/login");

ping请求处理程序和方法位于还包含登录处理程序的控制器中,并且没有单独的@PreAuthorize或其他可能引起此问题的注释。

问题是匿名访问被拒绝,用户被重定向到登录页面。

在调试级别登录时,我从Spring Security看到以下反馈:

[2014-07-11 13:18:04,483] [DEBUG] [org.springframework.security.web.access.intercept.FilterSecurityInterceptor] Secure object: FilterInvocation: URL: /ping; Attributes: [authenticated]
[2014-07-11 13:18:04,483] [DEBUG] [org.springframework.security.web.access.intercept.FilterSecurityInterceptor] Previously Authenticated: org.springframework.security.authentication.AnonymousAuthenticationToken@6faad796: Principal: anonymousUser; Credentials: [PROTECTED]; Authenticated: true; Details: org.springframework.security.web.authentication.WebAuthenticationDetails@ffffa64e: RemoteIpAddress: 192.168.2.128; SessionId: 0EF6B13BBA5F00C020FF9C35A6E3FBA9; Granted Authorities: ROLE_ANONYMOUS
[2014-07-11 13:18:04,483] [DEBUG] [org.springframework.security.access.vote.AffirmativeBased] Voter: org.springframework.security.web.access.expression.WebExpressionVoter@123f2882, returned: -1
[2014-07-11 13:18:04,483] [DEBUG] [org.springframework.security.web.access.ExceptionTranslationFilter] Access is denied (user is anonymous); redirecting to authentication entry point

我要完成的工作是拥有一个可以随时调用的方法,该方法将发送答复,指示请求是否在登录的会话中。

trans by 2020-07-05T04:41:43Z

java-@EnableWebSecurity和@EnableWebMvcSecurity有什么区别?

@EnableWebSecurity

JavaDoc文档:

将此注释添加到@Configuration类中,以在任何Spring MVC中定义CSRF Tokens配置,或者更可能通过扩展Spring MVC基类并覆盖各个方法来进行配置。

@EnableWebMvcSecurity

JavaDoc文档:

将此注释添加到CSRF Tokens类中,以使Spring MVC配置与Spring MVC集成。

  • “与Spring MVC集成”到底是什么意思? 我会得到哪些额外的行为?
  • 我找到了指南和答案,这表明该批注将CSRF Tokens添加到Spring MVC表格中,这是它唯一添加的内容吗?
trans by 2020-06-27T15:55:46Z

如何在Spring Security中编写自定义过滤器?

我希望每个请求都收到一些信息,所以我认为最好有一个过滤器,而不是为每个请求提供功能并分别从请求中获取这些信息。
因此,每个请求都将通过该过滤器,我得到了我想要的东西。

问题是:如何编写自定义过滤器?
假设它不像任何预定义的spring安全过滤器,并且是全新的。

trans by 2020-06-25T06:16:44Z

java-如何在Spring B中启用HTTP响应缓存

我已经使用Spring Boot 1.0.2实现了REST服务器。 我无法阻止Spring设置禁用HTTP缓存的HTTP标头。

我的控制器如下:

@Controller
public class MyRestController {
    @RequestMapping(value = "/someUrl", method = RequestMethod.GET)
    public @ResponseBody ResponseEntity<String> myMethod(
            HttpServletResponse httpResponse) throws SQLException {
        return new ResponseEntity<String>("{}", HttpStatus.OK);
    }
}

所有HTTP响应均包含以下标头:

Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Expires: 0
Pragma: no-cache

我尝试了以下操作来删除或更改这些标头:

  1. 在控制器中致电spring.resources.cache-period
  2. Call spring.resources.cache-period in the controller.
  3. 定义spring.resources.cache-period,该函数返回application.properties(我称之为setCacheSeconds(-1))。
  4. 将属性spring.resources.cache-period设置为-1或application.properties中的正值。

以上都不起作用。 如何在Spring Boot中为所有或单个请求禁用或更改这些标头?

trans by 2020-06-18T03:58:56Z

java-如何测试spring-security-oauth2资源服务器的安全性?

随着Spring Security 4的发布及其对测试的增强支持,我想更新当前的Spring Security oauth2资源服务器测试。

目前,我有一个帮助程序类,该类使用@WithSecurityContext设置@WithSecurityContext,并将测试SecurityMockMvcConfigurers.springSecurity()连接到实际的SecurityMockMvcRequestPostProcessors.*,以为我的测试请求有效的令牌。 然后,该重模板用于在我的MockMvcs中发出请求。

我想通过利用Spring Security 4中的新测试支持,放弃对实际AuthorizationServer的依赖,并在测试中使用有效(如果有限制)的用户凭据。

到目前为止,我使用src/test/java@WithSecurityContextSecurityMockMvcConfigurers.springSecurity()SecurityMockMvcRequestPostProcessors.*的所有尝试都无法通过MockMvc进行经过身份验证的调用,并且在Spring示例项目中找不到任何这样的工作示例。

有人可以帮助我使用某种模拟的凭据来测试我的oauth2资源服务器,同时仍然测试所施加的安全性限制吗?

**编辑**此处提供示例代码:[https://github.com/timtebeek/resource-server-testing]对于每个测试类,我都理解为什么它不能如此工作,但是我正在寻找使我能够轻松测试安全设置的方法。

我现在正在考虑在src/test/java下创建一个非常宽松的OAuthServer,这可能会有所帮助。 还有其他建议吗?

trans by 2020-06-17T04:29:22Z

在Spring中@Order注释有什么用?

我看过使用@Order批注的代码。 我想知道相对于Spring Security或Spring MVC,此注释的用途是什么。

这是一个例子:

@Order(1)
public class StatelessAuthenticationSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsService userDetailsService;

    @Autowired
    private TokenAuthenticationService tokenAuthenticationService;

}

如果不使用此注释,上述类的顺序会怎样?

trans by 2020-02-15T04:22:58Z

java-使用Spring Security 3.0设置会话超时期限

我正在使用Spring Security 3.0向LDAP服务器进行身份验证,但无法确定自己的会话超时时间。 我相信默认值为30分钟,但我需要将其设置为更长的时间

trans by 2020-02-11T05:32:09Z

Spring Security自定义身份验证和密码编码

有没有教程,或者有人对如何使用Spring-Security进行以下操作有指导吗?

任务:

我需要从数据库中获取用于身份验证的用户名的盐,然后使用它来加密提供的密码(从登录页面),以将其与存储的加密密码进行比较(也称为对用户进行身份验证)。

附加信息:

我使用自定义数据库结构。 通过自定义2707892803157361361665创建了new StandardPasswordEncoder("12345");对象,该对象又使用自定义DAOProvider从数据库中获取信息。

到目前为止我的new StandardPasswordEncoder("12345");文件:

<authentication-manager>
    <authentication-provider user-service-ref="userDetailsService">
    </authentication-provider>
</authentication-manager>

现在我想我需要

        <password-encoder hash="sha" />

但是还有什么呢? 我如何告诉Spring Security使用数据库提供的盐来对密码进行编码?


编辑:

我发现此SO帖子具有信息性,但还不够:如果我在xml中定义一个盐源,以供密码编码器使用,例如:

        <password-encoder ref="passwordEncoder">                
            <salt-source ref="saltSource"/>
        </password-encoder>

我必须编写一个自定义的SaltSource才能使用我的自定义盐。 但这在new StandardPasswordEncoder("12345");对象中找不到。 所以...

选择1:

我可以使用UserDetails的自定义实现,然后实现它的salt属性吗?

<beans:bean id="saltSource" class="path.to.MySaltSource"
    p:userPropertyToUse="salt"/>

@Service("userDetailsService") 
public class UserDetailsServiceImpl implements UserDetailsService {
    public UserDetails loadUserByUsername(String username)
            throws UsernameNotFoundException, DataAccessException {

        // ...
        return buildUserFromAccount(account);
    }

    @Transactional(readOnly = true)

    UserDetailsImpl buildUserFromAccount(Account account){

        // ... build User object that contains salt property
}

自定义用户类别:

public class UserDetailsImpl extends User{

    // ...

    private String salt;

    public String getSalt() { return salt; }

    public void setSalt(String salt) { this.salt = salt; }
}

security.xml:

<authentication-manager>
    <authentication-provider user-service-ref="userDetailsService">
        <password-encoder hash="sha">                
        <salt-source ref="saltSource"/>
    </password-encoder>
    </authentication-provider>
</authentication-manager>

<beans:bean id="saltSource" class="org.springframework.security.authentication.dao.ReflectionSaltSource" p:userPropertyToUse="salt"/>


选择2:

否则,我必须将我的accountDAO注入2790892803157361664,以从数据库中提取给定2780892803157361665的盐。

但是:Spring Security如何呼叫new StandardPasswordEncoder("12345");? 总是和<constructor-arg name="secret" value "12345" />在一起吗?

然后,我只需要确保我的new StandardPasswordEncoder("12345");使用accountDAO上的2789892803157361665来取盐即可。


编辑2:

刚刚得知我的方法是..legacy .. :(因此,我想我只会使用new StandardPasswordEncoder("12345");(我仍然必须弄清楚如何正确使用)。

顺便说一句:我用自定义UserDetails类实现了第一个选项,该类扩展了User类并仅添加了salt属性,然后将其作为userPropertyToUse传递给SaltSource,就像在Edit 1中提到的SO帖子中所建议的那样...


编辑3:

刚使StandardPasswordEncoder起作用,所以我在这里留一些指针:

使用StandardPasswordEncoder进行身份验证:

<beans:bean id="encoder" 
    class="org.springframework.security.crypto.password.StandardPasswordEncoder">
</beans:bean>


<authentication-manager>
    <authentication-provider user-service-ref="userDetailsService">
        <password-encoder ref="encoder" />         
    </authentication-provider>
</authentication-manager>

这需要版本3.1.0.RC中的spring-security-crypto模块吗? 我所知道的。 找不到任何具有3.0的存储库。 版本(即使其中包含列出的版本包含3.0.6等)。 此外,文档还讨论了Spring Security 3.1,所以我想,我会继续讲下去。

创建用户时(对我来说,只有管理员可以这样做),我只是使用

        StandardPasswordEncoder encoder = new StandardPasswordEncoder();
        String result = encoder.encode(password);

我完成了。

Spring Security将随机创建一个salt并将其添加到密码字符串中,然后再将其存储在数据库中,因此不再需要salt列。

但是,也可以提供全局盐作为构造函数参数(new StandardPasswordEncoder("12345");),但我不知道如何设置我的安全配置以从Bean检索该值,而不是提供带有<constructor-arg name="secret" value "12345" />665的静态字符串。但是我不知道 知道反正需要多少。

trans by 2020-01-18T09:47:08Z

成功登录后,Spring Security重定向到上一页

我知道之前曾有人问过这个问题,但是我在这里面临着一个特殊的问题。

我使用Spring Security 3.1.3。

我的Web应用程序中有3种可能的登录情况:

  1. 通过登录页面登录:确定。
  2. 通过受限页面登录:也可以。
  3. 通过非受限页面登录:不好,...每个人都可以访问“产品”页面,并且用户可以在登录后发表评论。 因此,同一页面中包含一个登录表单,以允许用户进行连接。

情况3)的问题是我无法设法将用户重定向到“产品”页面。 成功登录后,无论如何,它们都将重定向到主页。

请注意,在情况2)中,成功登录后,开箱即用的重定向到受限页面。

这是我的security.xml文件的相关部分:

<!-- Authentication policy for the restricted page  -->
<http use-expressions="true" auto-config="true" pattern="/restrictedPage/**">
    <form-login login-page="/login/restrictedLogin" authentication-failure-handler-ref="authenticationFailureHandler" />
    <intercept-url pattern="/**" access="isAuthenticated()" />
</http>

<!-- Authentication policy for every page -->
<http use-expressions="true" auto-config="true">
    <form-login login-page="/login" authentication-failure-handler-ref="authenticationFailureHandler" />
    <logout logout-url="/logout" logout-success-url="/" />
</http>

我怀疑“每个页面的身份验证策略”是造成该问题的原因。 但是,如果删除它,我将无法登录... j_spring_security_check发送404错误。


编辑:

多亏了Ralph,我才找到了解决方案。 这就是问题:我使用了物业

<property name="useReferer" value="true"/>

拉尔夫给我看的 之后,我的情况1出现了问题:通过登录页面登录时,用户停留在同一页面上(而不是像以前那样重定向到主页)。 到此阶段为止的代码如下:

<!-- Authentication policy for login page -->
<http use-expressions="true" auto-config="true" pattern="/login/**">
    <form-login login-page="/login" authentication-success-handler-ref="authenticationSuccessHandlerWithoutReferer" />
</http>

<!-- Authentication policy for every page -->
<http use-expressions="true" auto-config="true">
    <form-login login-page="/login" authentication-failure-handler-ref="authenticationFailureHandler" />
    <logout logout-url="/logout" logout-success-url="/" authentication-success-handler-ref="authenticationSuccessHandler"/>
</http>

<beans:bean id="authenticationSuccessHandler" class="org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler">
    <!-- After login, return to the last visited page -->
    <beans:property name="useReferer" value="true" />
</beans:bean>

<beans:bean id="authenticationSuccessHandlerWithoutReferer" class="org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler">
    <!-- After login, stay to the same page -->
    <beans:property name="useReferer" value="false" />
</beans:bean>

至少从理论上讲,这应该起作用,但事实并非如此。 我仍然不知道为什么,因此,如果有人对此有答案,我将很乐意创建一个新主题来允许他分享他的解决方案。

同时,我提出了一种解决方法。 不是最好的解决方案,但是就像我说的那样,如果有人能展示出更好的东西,我就会无所适从。 因此,这是登录页面的新身份验证策略:

<http use-expressions="true" auto-config="true" pattern="/login/**" >
    <intercept-url pattern="/**" access="isAnonymous()" />
    <access-denied-handler error-page="/"/>
</http>

解决方案非常明显:登录页面仅允许匿名用户使用。 连接用户后,错误处理程序会将其重定向到主页。

我做了一些测试,一切似乎都运行良好。

trans by 2020-01-09T20:02:44Z

无法找到XML模式命名空间的Spring NamespaceHandler [[http://www.springframework.org/schema/security]]

我正在开发我在Spring Security中的第一个应用程序。 我的applicationContext-security.xml文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>

<!--
  -  Namespace-based OpenID configuration
  -->

<b:beans xmlns="http://www.springframework.org/schema/security"
    xmlns:b="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                        http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd">

    <http>
        <intercept-url pattern="/**" access="ROLE_USER"/>
        <intercept-url pattern="/index.xhtml*" filters="none"/>
        <logout/>
        <openid-login login-page="/index.xhtml" authentication-failure-url="/index.xhtml?login_error=true">
            <attribute-exchange>
                <openid-attribute name="email" type="http://schema.openid.net/contact/email" required="true" count="2"/>
                <openid-attribute name="name" type="http://schema.openid.net/namePerson/friendly" />
            </attribute-exchange>
        </openid-login>
        <remember-me token-repository-ref="tokenRepo"/>
    </http>

    <b:bean id="tokenRepo"
            class="org.springframework.security.web.authentication.rememberme.InMemoryTokenRepositoryImpl" />

    <authentication-manager alias="authenticationManager"/>

    <user-service id="userService">
        <user name="http://user.myopenid.com/" authorities="ROLE_SUPERVISOR,ROLE_USER" />
    </user-service>

</b:beans>

和Web.xml文件是:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">

    <display-name>Spring Security OpenID Demo Application</display-name>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/applicationContext-security.xml
        </param-value>
    </context-param>

    <context-param>
        <param-name>log4jConfigLocation</param-name>
        <param-value>/WEB-INF/classes/log4j.properties</param-value>
    </context-param>

    <context-param>
        <param-name>webAppRootKey</param-name>
        <param-value>openid.root</param-value>
    </context-param>

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

    <filter-mapping>
      <filter-name>springSecurityFilterChain</filter-name>
      <url-pattern>/*</url-pattern>
    </filter-mapping>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <listener>
        <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
    </listener>
     <welcome-file-list>
        <welcome-file>faces/index.xhtml</welcome-file>
    </welcome-file-list>
</web-app>

清理并构建应用程序成功,但是当我尝试部署应用程序时,jetty 7给了我以下错误:

严重:上下文初始化失败
org.springframework.beans.factory.parsing.BeanDefinitionParsingException:配置问题:无法找到XML模式命名空间的Spring NamespaceHandler [[http://www.springframework.org/schema/security]]
令人反感的资源:ServletContext资源[/WEB-INF/applicationContext-security.xml]
在org.springframework.beans.factory.parsing.FailFastProblemReporter.error(FailFastProblemReporter.java:68)
在org.springframework.beans.factory.parsing.ReaderContext.error(ReaderContext.java:85)
在org.springframework.beans.factory.parsing.ReaderContext.error(ReaderContext.java:80)

尝试了一切,但不能解决此错误。 任何帮助,将不胜感激。

编辑我尝试添加3.0.2版本的Spring-Security并得到以下信息:

上下文初始化失败
org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException:来自ServletContext资源[/WEB-INF/applicationContext-security.xml]的XML文档中的第13行无效;
嵌套的异常是org.xml.sax.SAXParseException; lineNumber:13; columnNumber:11; cvc-complex-type.2.4.c:匹配的通配符是严格的,但是找不到元素'http'的声明。       在org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:396)
在org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334

trans by 2020-01-05T12:28:32Z

java-如何从Spring Security使用新的PasswordEncoder

从Spring Security 3.1.4.RELEASE开始,旧版本StandardPasswordEncoder已被弃用,而旧版本org.springframework.security.crypto.password.PasswordEncoder已弃用。由于我的应用程序尚未公开发布,因此我决定使用新的,未弃用的API。

到目前为止,我有一个StandardPasswordEncoder,它会自动将用户的注册日期用作每个用户的注册密码。

String encodedPassword = passwordEncoder.encodePassword(rawPassword, saltSource.getSalt(user));

在登录过程中,Spring还使用了我的bean来验证用户是否可以登录。我无法在新的密码编码器中实现此操作,因为SHA-1的默认实现-StandardPasswordEncoder仅能添加一个 编码器创建过程中的全局秘密盐。

有没有合理的方法可以使用未弃用的API进行设置?

trans by 2019-12-28T09:57:43Z

Spring Security中的多个身份验证提供程序

我在Spring Security配置中配置了两个身份验证提供程序:

   <security:authentication-manager>
      <security:authentication-provider ref="XProvider" />
      <security:authentication-provider ref="YProvider" />
   </security:authentication-manager>

Spring Security是否同时评估两个提供者? 还是停止评估其中之一是否失败? 如果没有,如何使其停止?

谢谢。

trans by 2019-12-28T09:47:53Z

1 2 3 下一页 共3页