我的用例是验证&然后根据@PathVariable参数授权用户。我需要执行一些自定义代码来授权主体。我不确定这里采取的方法 -
我已经实现了一个自定义的AbstractAuthenticationProcessingFilter& AuthenticationProvider用于身份验证,最终向主体授予角色。我可以检查servlet请求中的pathvariables(使用HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE),并向Authentication令牌添加其他权限。然后我可以使用内置的hasRole,hasPermission表达式来实现访问控制。
我可以扩展WebSecurityExpressionRoot并实现自定义的AbstractSecurityExpressionHandler并定义我自己的表达式,以便在intercept-url访问控制表达式中使用。在我的WebSecurityExpressionRoot实现中定义自定义方法时,我不确定如何访问@PathVariables。
哪种方法更可取,还是有另一种方法可以干净利落地完成这项工作?
答案 0 :(得分:2)
我确实有一个解决方案。 在配置类
中@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter
我可以有方法
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/student/{id}/**")
.access("@guard.checkUserId(authentication,#id)");
}
而Spel中的@guard链接到
@Component
public class Guard {
@Autowired
private UserRepository repo;
public boolean checkUserId(Authentication authentication, int id) {
String name = authentication.getName();
System.out.println(name+" at "+id);
User result = repo.findByUsername(name);
return result != null && result.getPid() == id;
}
}
实际上,SpEL中的#id可以获取从上一行{id}中提取的值。您可以在checkUserId中执行任何操作,返回值将决定是否允许访问路径。
答案 1 :(得分:1)
我可以想象的一种方法是使用方法级授权捕获参数中的path变量,然后使用hasPermission
。 This answer详细介绍了如何做到这一点 - 以防它有用。