Java安全框架(一)Spring Security (5)

​ 里面的核心方法是supports方法,方法中用到一个decisionVoters的集合,集合中的类型是AccessDecisionVoter,这是Spring Security引入的一个投票器,有无权限访问的最终决定权就是由投票器来决定的。

package org.springframework.security.access; import java.util.Collection; import org.springframework.security.core.Authentication; public interface AccessDecisionVoter<S> { int ACCESS_GRANTED = 1; int ACCESS_ABSTAIN = 0; int ACCESS_DENIED = -1; boolean supports(ConfigAttribute attribute); boolean supports(Class<?> clazz); int vote(Authentication authentication, S object, Collection<ConfigAttribute> attributes); }

​ 这里有很多投票器,最常见的为RoleVoter投票器,RoleVoter定义了权限的前缀"ROLE_",投票器的核心是靠vote这个选举方法来实现的,方法中的参数authentication是用户及权限信息,attributes是访问资源需要的权限,代码里循环判断用户是否有访问资源需要的权限,如果有就返回ACCESS_GRANTED,即有权限。

package org.springframework.security.access.vote; import java.util.Collection; import org.springframework.security.access.AccessDecisionVoter; import org.springframework.security.access.ConfigAttribute; import org.springframework.security.core.Authentication; import org.springframework.security.core.GrantedAuthority; public class RoleVoter implements AccessDecisionVoter<Object> { private String rolePrefix = "ROLE_"; public String getRolePrefix() { return rolePrefix; } public void setRolePrefix(String rolePrefix) { this.rolePrefix = rolePrefix; } public boolean supports(ConfigAttribute attribute) { if ((attribute.getAttribute() != null) && attribute.getAttribute().startsWith(getRolePrefix())) { return true; } else { return false; } } public boolean supports(Class<?> clazz) { return true; } /** * authentication是用户及权限信息 * attributes是访问资源需要的权限 */ public int vote(Authentication authentication, Object object, Collection<ConfigAttribute> attributes) { if (authentication == null) { return ACCESS_DENIED; } int result = ACCESS_ABSTAIN; Collection<? extends GrantedAuthority> authorities = extractAuthorities(authentication); for (ConfigAttribute attribute : attributes) { if (this.supports(attribute)) { result = ACCESS_DENIED; // Attempt to find a matching granted authority for (GrantedAuthority authority : authorities) { if (attribute.getAttribute().equals(authority.getAuthority())) { return ACCESS_GRANTED; } } } } return result; } Collection<? extends GrantedAuthority> extractAuthorities( Authentication authentication) { return authentication.getAuthorities(); } }

​ Spring Seucrity提供了三种投票决策,分别是AffirmativeBased:一票通过即可访问;ConsensusBased:一半以上通过才允许访问;UnanimousBased:全部通过才允许访问。自定义决策只需要继承AbstractAccessDecisionManager抽象类,可以自定义自己的投票器,比如需要同时满足多个条件才能访问等,不需要使用Spring Security自带的投票器。

2、环境搭建及使用 2.1 快速搭建Spring Boot + Spring Security环境

​ 打开Spring Boot官网https://start.spring.io/,选择Java语言,在Dependencies中添加Spring Web和Spring Security,最后点击GENERATE下载。

Java安全框架(一)Spring Security

​ 解压下载的文件,用idea打开,可以看到这是一个可以直接启动的demo,因为我们是web项目,所以这里添加一个接口看一下。

@SpringBootApplication @RestController public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } @RequestMapping("http://www.likecs.com/") public String home() { return "hello spring boot"; } }

​ 启动后我们在地址栏输入locahost:8080会自动跳转到/login路径,说明Spring Security就已经直接参与进来了。

Java安全框架(一)Spring Security

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzxdps.html