在运行时修改Spring Security Config

时间:2016-08-22 22:10:11

标签: spring spring-security spring-websocket

我正在使用最新的Spring Boot + Spring Boot Starter Security来实现一个简单的代理应用程序。目标是使用单一路线/方法启动应用程序:

@RequestMapping(value = "/api/register",
    method = RequestMethod.POST,
    produces = MediaType.APPLICATION_JSON_VALUE)
@Timed
public ResponseEntity<?> register(Registration registration) {

安全配置为:

@Override
protected void configure(HttpSecurity http) throws Exception {
    this.http = http
        .authorizeRequests()
        .antMatchers("/api/register").hasAuthority(AuthorityConstants.ADMIN)
    .and();
}

public HttpSecurity getHttpSecurity() {
    return http;
}

申请的目标是接受以下表格的注册申请:

{
    "route":"/api/foo/bar",
    "proxy_location": "http://back-end-server/path/to/resource",
    "role": "some-authority"
}

然后,应用程序将添加一个/api/foo/bar路由,该路由具有预定义的方法,该方法将未来请求代理(转发)到后端服务。

我知道这有点傻,真正的用例涉及websockets和动态创建主题。

我面临的问题是,在SecurityConfigurer完成后,我似乎无法更新安全配置。

在上面的代码示例中,我正在缓存给予HttpSecurity的{​​{1}}对象,然后再次尝试使用该对象来配置新路由:

SecurityConfigurer

有没有办法在运行时动态更新安全配置?

另外,如果有人有关于动态创建websocket主题的任何注释,也会受到赞赏!

1 个答案:

答案 0 :(得分:0)

您有几种选择:

  • 使用antchMatcher("/some/path").access("@someBean.hasAccess(authentication)")。这允许您基本上在应用程序上下文中使用任何bean来应用您需要的验证。

  • 对您@PreAuthorize("@someBean.hasAccess(authentication)")带注释的方法使用RequestMapping。和以前一样的想法,但作为端点本身的拦截器。

  • 实施您自己的SecurityExpressionHandler并将其插入http.authorizeRequests().expressionHandler(...)

  • 实施您自己的安全过滤器,以处理您需要的任何内容。