我正在使用最新的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主题的任何注释,也会受到赞赏!
答案 0 :(得分:0)
您有几种选择:
使用antchMatcher("/some/path").access("@someBean.hasAccess(authentication)")
。这允许您基本上在应用程序上下文中使用任何bean来应用您需要的验证。
对您@PreAuthorize("@someBean.hasAccess(authentication)")
带注释的方法使用RequestMapping
。和以前一样的想法,但作为端点本身的拦截器。
实施您自己的SecurityExpressionHandler
并将其插入http.authorizeRequests().expressionHandler(...)
。
实施您自己的安全过滤器,以处理您需要的任何内容。