基于路径变量的spring-security授权

时间:2015-10-14 02:10:04

标签: spring spring-security

我的用例是验证&然后根据@PathVariable参数授权用户。我需要执行一些自定义代码来授权主体。我不确定这里采取的方法 -

  1. 我已经实现了一个自定义的AbstractAuthenticationProcessingFilter& AuthenticationProvider用于身份验证,最终向主体授予角色。我可以检查servlet请求中的pathvariables(使用HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE),并向Authentication令牌添加其他权限。然后我可以使用内置的hasRole,hasPermission表达式来实现访问控制。

  2. 我可以扩展WebSecurityExpressionRoot并实现自定义的AbstractSecurityExpressionHandler并定义我自己的表达式,以便在intercept-url访问控制表达式中使用。在我的WebSecurityExpressionRoot实现中定义自定义方法时,我不确定如何访问@PathVariables。

  3. 哪种方法更可取,还是有另一种方法可以干净利落地完成这项工作?

2 个答案:

答案 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变量,然后使用hasPermissionThis answer详细介绍了如何做到这一点 - 以防它有用。