21.Spring Security应用详解-授权-web授权
2020-03-28 本文已影响0人
LANSHENGYANG
web授权
- 在上面例子中我们完成了认证拦截,并对/r/**下的某些资源进行简单的授权保护,但是我们想进行灵活的授权控制该怎么做呢?通过给
http.authorizeRequests()
添加多个子节点来定制需求到我们的URL,如下代码:
@Override
protected void configure (HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/r/r1").hasAuthority("p1")
.antMatchers("/r/r2").hasAuthority("p2")
.antMatchers("/r/r3").access("hasAuthority('p1') and hasAuthority('p2')")
.antMatchers("/r/**").authenticated()
.anyRequest().permitAll()
.and()
.formLogin()
//...
}
- (1)http.authorizeRequests()方法有多个子节点,每个macher按照他们的声明顺序执行。
- (2)指定"/r/r1"URL,拥有p1权限能够访问
- (3)指定"/r/r2"URL,拥有p2权限能够访问
- (4)指定了"/r/r3"URL,拥有p1和p2权限才能够访问
- (5)制定了除了r1,r2,r3之外"/r/**"资源,同时通过身份认证就能够访问,这里使用SpEL(Spring Expression Language)表达式。
- (6)剩余的尚未匹配的资源,不做保护。
注意
- 规则的顺序是重要的,更具体的规则应该先写,现在以/admin开始的所有内容都需要具有ADMIN角色的身份验证用户,即使是/admin/login路径(因为/admin/login已经被/admin/**规则匹配,因此第二个规则被忽略)。
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/admin/login").permitAll()
- 因此,登录页面的规则应该在/admin/**规则之前,例如:
.antMatchers("/admin/login").permitAll()
.antMatchers("/admin/**").hasRole("ADMIN")
- 保护URL常用的方法有:
- authentication()保护URL,需要用户登录