cwi*_*tah 8 spring-security spring-boot
我有自定义身份验证筛选器,它创建PreAuthenticatedAuthenticationToken并将其存储在安全上下文中.过滤器工作正常,它使用适当的授权权限"ROLE_user"和"ROLE_adminuser"创建令牌.这是我的配置:
@Configuration
@EnableWebMvcSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
X509AuthenticationFilter filter = new X509AuthenticationFilter()
filter.setAuthenticationManager(authenticationManager())
http.addFilterAfter(filter, SecurityContextPersistenceFilter.class)
http.authorizeRequests().anyRequest().permitAll()
}
@Bean
public FilterRegistrationBean filterRegistrationBean() {
FilterRegistrationBean registrationBean = new FilterRegistrationBean()
X509AuthenticationFilter filter = new X509AuthenticationFilter()
filter.setAuthenticationManager(authenticationManager())
registrationBean.setFilter(filter)
registrationBean.setEnabled(false)
return registrationBean
}
Run Code Online (Sandbox Code Playgroud)
我在SecurityContextPersistenceFilter之前插入Filter,如下所述:Spring安全性和自定义AuthenticationFilter与Spring启动.
但是,当我尝试将PreAuthorize注释添加到我的控制器方法时,这似乎工作正常,如下所示:
@Controller
@RequestMapping("/security")
class SecurityController {
@RequestMapping("/authenticate")
@PreAuthorize("hasRole('ROLE_user')")
@ResponseBody
ResponseEntity<String> authenticate(HttpServletRequest request, Principal principal) {
println "authenticate: " + SecurityContextHolder.getContext().getAuthentication()
return new ResponseEntity<String>(getPreAuthenticatedPrincipal(request), HttpStatus.OK)
}
Run Code Online (Sandbox Code Playgroud)
我收到404错误.如果我注释掉PreAuthorize注释,则方法调用有效,您可以看到我打印出身份验证信息,并且经过身份验证的用户已为其授予的权限使用ROLE_user和ROLE_adminuser.我不确定我做错了什么.
当"PreAuthorize"被注释掉时,这是在主体中打印出认证对象:
authenticate:org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationToken@817a0240:Principal:org.springframework.security.ldap.userdetails.LdapUserDetailsImpl@c279eab8:Dn:uid = 1,ou = people,dc = cdpe,dc =万; 用户名:xxxx@gmail.com; 密码保护]; 启用:true; AccountNonExpired:true; CredentialsNonExpired:true; AccountNonLocked:true; 授权机构:ROLE_adminuser,ROLE_user; 证书:[保护]; 认证:真实; 详细信息:org.springframework.security.web.authentication.WebAuthenticationDetails@957e:RemoteIpAddress:127.0.0.1; SessionId:null; 授权机构:ROLE_adminuser,ROLE_user权限:[ROLE_adminuser,ROLE_user]
更新:我取得了一些进展.我将proxyTargetClass添加到以下注释:
@EnableGlobalMethodSecurity(prePostEnabled = true, proxyTargetClass = true)
Run Code Online (Sandbox Code Playgroud)
现在,当我打电话给我的方法时,我得到403 Forbidden返回.我不知道那是做什么的.
嗯,Spring Security配置总是很乏味,唯一的方法是:
对于a的配置X509AuthenticationFilter,HttpSecurityjavadoc给出了x509以下示例的方法(适用于您的配置 - 请参阅原始的javadoc):
@Configuration
@EnableWebMvcSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests().anyRequest().permitAll()
// Example x509() configuration
.x509();
}
}
Run Code Online (Sandbox Code Playgroud)
具有以下指示:方法返回X509Configurer进一步的自定义.
除非你有充分的理由做不同的事情(如果是这种情况请说出来)我强烈建议你坚持这种方法.
但是在控制器上使用事前注释确实是一个坏主意,因为可以直接在HttpSecurity配置中完成.它迫使你使用proxyTargetClass = true.
前后注释通常应用于服务层的方法,proxyTargetClass=true因为服务通常通过允许JDK代理的接口连接到控制器,所以不需要服务层.
| 归档时间: |
|
| 查看次数: |
15342 次 |
| 最近记录: |