From 56364722d3ed70d48ec41f567a4e59e5ccbbb868 Mon Sep 17 00:00:00 2001
From: admin <weikou2014>
Date: 星期四, 19 五月 2022 17:45:42 +0800
Subject: [PATCH] 增加权限管理

---
 src/main/resources/code/service/app/src/main/java/com/ks/app/config/WebSecurityConfig.java |  104 +++++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 87 insertions(+), 17 deletions(-)

diff --git a/src/main/resources/code/service/app/src/main/java/com/ks/app/config/WebSecurityConfig.java b/src/main/resources/code/service/app/src/main/java/com/ks/app/config/WebSecurityConfig.java
index 4e28295..08d81b9 100644
--- a/src/main/resources/code/service/app/src/main/java/com/ks/app/config/WebSecurityConfig.java
+++ b/src/main/resources/code/service/app/src/main/java/com/ks/app/config/WebSecurityConfig.java
@@ -3,10 +3,9 @@
 import com.google.code.kaptcha.Producer;
 import com.google.code.kaptcha.impl.DefaultKaptcha;
 import com.google.code.kaptcha.util.Config;
-import com.ks.app.entity.AdminUser;
+import com.ks.app.entity.admin.AdminUser;
 import com.ks.app.service.inter.AdminUserService;
 import net.sf.json.JSONObject;
-import org.omg.CORBA.SystemException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.context.annotation.Bean;
@@ -20,6 +19,7 @@
 import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
 import org.springframework.security.core.Authentication;
 import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.core.context.SecurityContext;
 import org.springframework.security.core.userdetails.UserDetails;
 import org.springframework.security.core.userdetails.UserDetailsService;
 import org.springframework.security.core.userdetails.UsernameNotFoundException;
@@ -29,6 +29,7 @@
 import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
 import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
 import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;
+import org.springframework.util.AntPathMatcher;
 import org.springframework.web.filter.OncePerRequestFilter;
 import org.yeshi.utils.JsonUtil;
 import org.yeshi.utils.StringUtil;
@@ -46,12 +47,18 @@
 public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
 
 
+    private final static String[] STATIC_RESOURCE_PATHS = new String[]{
+            "/**/*.html", "/**/*.css", "/**/*.js", "/**/*.png", "/**/*.jpg", "/**/*.jpeg", "/**/*.gif", "/**/*.xml", "/**/font/*", "/**/fonts/*"
+    };
+
     private Logger logger = LoggerFactory.getLogger(WebSecurityConfig.class);
 
     @Resource
     private AdminUserService adminUserService;
 
     private final String LOGIN_PROCESSING_URL = "/admin/api/login";
+
+    private final String LOGIN_PAGE_PATH = "/admin/xrtfgp/login.html";
 
     //鍥惧舰楠岃瘉鐮侀厤缃�
     @Bean
@@ -89,9 +96,16 @@
     }
 
 
-    //楠岃瘉鐮佽繃婊ゅ櫒
-    class VerificationCodeFilter extends OncePerRequestFilter {
-        private AuthenticationFailureHandler authenticationFailureHandler = new AuthenticationFailureHandler() {
+    /**
+     * @author hxh
+     * @description 璇锋眰涔嬪墠鐨勯獙璇佸櫒
+     * @date 16:51 2022/5/19
+     * @return
+     **/
+    class PreRequestVerifyFilter extends OncePerRequestFilter {
+
+        //澶勭悊楠岃瘉鐮佸嚭閿�
+        private AuthenticationFailureHandler verifyCodeFailureHandler = new AuthenticationFailureHandler() {
             @Override
             public void onAuthenticationFailure(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AuthenticationException e) throws IOException, ServletException {
                 httpServletResponse.setContentType("application/json;charset=UTF-8");
@@ -102,20 +116,74 @@
             }
         };
 
+        //澶勭悊娌℃湁鏉冮檺
+        private AuthenticationFailureHandler authenticationFailureHandler = new AuthenticationFailureHandler() {
+            @Override
+            public void onAuthenticationFailure(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AuthenticationException e) throws IOException, ServletException {
+                httpServletResponse.setStatus(HttpStatus.FORBIDDEN.value());
+            }
+        };
+
         @Override
         protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {
             if (!LOGIN_PROCESSING_URL.equalsIgnoreCase(httpServletRequest.getRequestURI())) {
-                filterChain.doFilter(httpServletRequest, httpServletResponse);
+                //闈炵櫥褰曟帴鍙�
+                String url = httpServletRequest.getRequestURI();
+                //涓嶉獙璇侀潤鎬佽祫婧�
+                AntPathMatcher pathMatcher = new AntPathMatcher();
+                for (String resource : STATIC_RESOURCE_PATHS) {
+                    if (pathMatcher.match(resource, url)) {
+                        filterChain.doFilter(httpServletRequest, httpServletResponse);
+                        return;
+                    }
+                }
+
+                //灏氭湭鐧诲綍鎺堟潈鐨勫氨涓嶉渶瑕侀獙璇佹潈闄愪簡
+                SecurityContext contextSession = (SecurityContext) httpServletRequest.getSession().getAttribute("SPRING_SECURITY_CONTEXT");
+
+                if (contextSession == null) {
+                    filterChain.doFilter(httpServletRequest, httpServletResponse);
+                    return;
+                }
+                Authentication authentication = contextSession.getAuthentication();
+                if (authentication == null) {
+                    filterChain.doFilter(httpServletRequest, httpServletResponse);
+                    return;
+                }
+                AdminUser adminUser = (AdminUser) authentication.getPrincipal();
+                if (adminUser == null) {
+                    filterChain.doFilter(httpServletRequest, httpServletResponse);
+                    return;
+                }
+
+                //楠岃瘉鏉冮檺
+                for (String path : adminUser.getRules()) {
+                    if (pathMatcher.match(path, url)) {
+                        //鏈夋潈闄�
+                        filterChain.doFilter(httpServletRequest, httpServletResponse);
+                        return;
+                    }
+                }
+                //鏃犳潈闄�
+                authenticationFailureHandler.onAuthenticationFailure(httpServletRequest, httpServletResponse, null);
             } else {
+                //鐧诲綍鎺ュ彛
                 try {
                     verificationCode(httpServletRequest);
                     filterChain.doFilter(httpServletRequest, httpServletResponse);
                 } catch (VerificationCodeException e) {
-                    authenticationFailureHandler.onAuthenticationFailure(httpServletRequest, httpServletResponse, e);
+                    verifyCodeFailureHandler.onAuthenticationFailure(httpServletRequest, httpServletResponse, e);
                 }
             }
         }
 
+        /**
+         * @return void
+         * @author hxh
+         * @description 楠岃瘉楠岃瘉鐮佹槸鍚︽纭�
+         * @date 16:54 2022/5/19
+         * @param: httpServletRequest
+         **/
         private void verificationCode(HttpServletRequest httpServletRequest) throws VerificationCodeException {
             String requestCode = httpServletRequest.getParameter("captcha");
             HttpSession httpSession = httpServletRequest.getSession();
@@ -124,8 +192,6 @@
             if (StringUtil.isNullOrEmpty(captcha) || StringUtil.isNullOrEmpty(requestCode) || !captcha.equalsIgnoreCase(requestCode)) {
                 throw new VerificationCodeException();
             }
-
-
         }
     }
 
@@ -139,7 +205,7 @@
                 .and()
                 .formLogin()
                 //鑷畾涔夌櫥褰曠晫闈�
-                .loginPage("/login.html")
+                .loginPage(LOGIN_PAGE_PATH)
                 //澶勭悊鐧诲綍閫昏緫鐨剈rl
                 .loginProcessingUrl(LOGIN_PROCESSING_URL)
                 //鐧诲綍鎴愬姛鍚庣殑璺宠浆
@@ -179,8 +245,8 @@
                 .and()
                 .csrf().disable()
                 .rememberMe().userDetailsService(new MyUserDetailsService())
-                .and().exceptionHandling().authenticationEntryPoint(new CustomAuthenticationEntryPoint());
-        http.addFilterBefore(new VerificationCodeFilter(), UsernamePasswordAuthenticationFilter.class);
+                .and().exceptionHandling().authenticationEntryPoint(new NotLoginAuthenticationEntryPoint());
+        http.addFilterBefore(new PreRequestVerifyFilter(), UsernamePasswordAuthenticationFilter.class);
     }
 
     @Override
@@ -241,19 +307,23 @@
     }
 
 
-    //鑷畾涔夋湭鎺堟潈杩斿洖
-    class CustomAuthenticationEntryPoint implements AuthenticationEntryPoint {
+    /**
+     * @author hxh
+     * @description 鏈櫥褰曠殑浜嬩欢澶勭悊
+     * @date 16:55 2022/5/19
+     * @return
+     **/
+    class NotLoginAuthenticationEntryPoint implements AuthenticationEntryPoint {
         @Override
         public void commence(HttpServletRequest request, HttpServletResponse response,
                              AuthenticationException authException) throws IOException, ServletException {
-            String url = request.getRequestURI().toString();
+            String url = request.getRequestURI();
             if (url.contains("/admin/api/")) {
                 response.setStatus(HttpStatus.UNAUTHORIZED.value());
             } else {
-                response.sendRedirect("/login.html");
+                response.sendRedirect(LOGIN_PAGE_PATH);
             }
         }
     }
-
 
 }

--
Gitblit v1.8.0