1 package com.supwisdom.institute.backend.admin.bff.security.web.access.intercept;
3 import java.io.IOException;
4 import java.util.HashSet;
7 import javax.servlet.ServletException;
9 import org.springframework.beans.factory.annotation.Autowired;
10 import org.springframework.security.access.AccessDecisionManager;
11 import org.springframework.security.access.SecurityMetadataSource;
12 import org.springframework.security.access.intercept.InterceptorStatusToken;
13 import org.springframework.security.web.FilterInvocation;
14 import org.springframework.security.web.access.intercept.FilterInvocationSecurityMetadataSource;
16 import com.supwisdom.infras.security.web.access.intercept.InfrasFilterSecurityInterceptor;
17 import com.supwisdom.institute.backend.admin.bff.utils.AuthenticationUtil;
19 import lombok.extern.slf4j.Slf4j;
22 public class MyFilterSecurityInterceptor extends InfrasFilterSecurityInterceptor {
25 private FilterInvocationSecurityMetadataSource securityMetadataSource;
28 public void setAccessDecisionManager(AccessDecisionManager accessDecisionManager) {
30 super.setAccessDecisionManager(accessDecisionManager);
34 public void invoke(FilterInvocation fi) throws IOException, ServletException {
36 Set<String> noneSecurityUrl = new HashSet<String>(); // FIXME: 对无须访问控制的url,支持可配置
37 noneSecurityUrl.add("/web/login");
38 noneSecurityUrl.add("/web/logout");
39 noneSecurityUrl.add("/web/index");
41 if (fi.getRequest() != null) {
42 String requestUrl = fi.getRequestUrl(); log.debug("MyFilterSecurityInterceptor invoke requestUrl: {}", requestUrl);
43 if (noneSecurityUrl.contains(requestUrl)) {
44 fi.getChain().doFilter(fi.getRequest(), fi.getResponse());
49 if(AuthenticationUtil.isAdministrator()){
50 fi.getChain().doFilter(fi.getRequest(), fi.getResponse());
55 // 里面调用MyInvocationSecurityMetadataSource的getAttributes(Object object)这个方法获取fi对应的所有权限
56 // 再调用MyAccessDecisionManager的decide方法来校验用户的权限是否足够
57 InterceptorStatusToken token = super.beforeInvocation(fi);
60 fi.getChain().doFilter(fi.getRequest(), fi.getResponse());
62 super.afterInvocation(token, null);
67 public Class<?> getSecureObjectClass() {
69 return FilterInvocation.class;
73 public SecurityMetadataSource obtainSecurityMetadataSource() {
75 return this.securityMetadataSource;