Bladeren bron

权限demo版

weiximei 6 jaren geleden
bovenliggende
commit
b3f4aab524
15 gewijzigde bestanden met toevoegingen van 245 en 0 verwijderingen
  1. 4
    0
      SmartCommunity/SmartCommunityV1/zuul/src/main/java/com/example/demo/config/entity/UserElement.java
  2. 19
    0
      SmartCommunity/SmartCommunityV1/zuul/src/main/java/com/example/demo/constant/Constants.java
  3. 4
    0
      SmartCommunity/SmartCommunityV1/zuul/src/main/java/com/example/demo/constant/Header.java
  4. 4
    0
      SmartCommunity/SmartCommunityV1/zuul/src/main/java/com/example/demo/constant/Status.java
  5. 4
    0
      SmartCommunity/SmartCommunityV1/zuul/src/main/java/com/example/demo/dto/MenuDTO.java
  6. 4
    0
      SmartCommunity/SmartCommunityV1/zuul/src/main/java/com/example/demo/dto/RoleDTO.java
  7. 4
    0
      SmartCommunity/SmartCommunityV1/zuul/src/main/java/com/example/demo/exception/WisdomSecurityException.java
  8. 4
    0
      SmartCommunity/SmartCommunityV1/zuul/src/main/java/com/example/demo/security/RestAuthenticationEntryPoint.java
  9. 4
    0
      SmartCommunity/SmartCommunityV1/zuul/src/main/java/com/example/demo/security/RestPreAuthenticateProvider.java
  10. 152
    0
      SmartCommunity/SmartCommunityV1/zuul/src/main/java/com/example/demo/security/RestPreAuthenticatedProcessingFilter.java
  11. 26
    0
      SmartCommunity/SmartCommunityV1/zuul/src/main/java/com/example/demo/security/TokenAuthrentication.java
  12. 4
    0
      SmartCommunity/SmartCommunityV1/zuul/src/main/java/com/example/demo/service/IRoleService.java
  13. 4
    0
      SmartCommunity/SmartCommunityV1/zuul/src/main/java/com/example/demo/service/IUserService.java
  14. 4
    0
      SmartCommunity/SmartCommunityV1/zuul/src/main/java/com/example/demo/service/impl/RoleService.java
  15. 4
    0
      SmartCommunity/SmartCommunityV1/zuul/src/main/java/com/example/demo/service/impl/UserService.java

+ 4
- 0
SmartCommunity/SmartCommunityV1/zuul/src/main/java/com/example/demo/config/entity/UserElement.java Bestand weergeven

@@ -0,0 +1,4 @@
1
+package com.example.demo.config.entity;
2
+
3
+public class UserElement {
4
+}

+ 19
- 0
SmartCommunity/SmartCommunityV1/zuul/src/main/java/com/example/demo/constant/Constants.java Bestand weergeven

@@ -0,0 +1,19 @@
1
+package com.example.demo.constant;
2
+
3
+/**
4
+ * 定义参数
5
+ * @author weiximei
6
+ */
7
+public class Parameters {
8
+
9
+    /**
10
+     * 不需要授权的URL身份
11
+     */
12
+    public static final String ROLE_NONO = "ROLE_NONE";
13
+
14
+    /**
15
+     * token
16
+     */
17
+    public static final String X_AUTH_TOKEN = "X-Auth-Token";
18
+
19
+}

+ 4
- 0
SmartCommunity/SmartCommunityV1/zuul/src/main/java/com/example/demo/constant/Header.java Bestand weergeven

@@ -0,0 +1,4 @@
1
+package com.example.demo.constant;
2
+
3
+public class Header {
4
+}

+ 4
- 0
SmartCommunity/SmartCommunityV1/zuul/src/main/java/com/example/demo/constant/Status.java Bestand weergeven

@@ -0,0 +1,4 @@
1
+package com.example.demo.constant;
2
+
3
+public enum Status {
4
+}

+ 4
- 0
SmartCommunity/SmartCommunityV1/zuul/src/main/java/com/example/demo/dto/MenuDTO.java Bestand weergeven

@@ -0,0 +1,4 @@
1
+package com.example.demo.dto;
2
+
3
+public class MenuDTO {
4
+}

+ 4
- 0
SmartCommunity/SmartCommunityV1/zuul/src/main/java/com/example/demo/dto/RoleDTO.java Bestand weergeven

@@ -0,0 +1,4 @@
1
+package com.example.demo.dto;
2
+
3
+public class RoleDTO {
4
+}

+ 4
- 0
SmartCommunity/SmartCommunityV1/zuul/src/main/java/com/example/demo/exception/WisdomSecurityException.java Bestand weergeven

@@ -0,0 +1,4 @@
1
+package com.example.demo.exception;
2
+
3
+public class WisdomSecurityException {
4
+}

+ 4
- 0
SmartCommunity/SmartCommunityV1/zuul/src/main/java/com/example/demo/security/RestAuthenticationEntryPoint.java Bestand weergeven

@@ -0,0 +1,4 @@
1
+package com.example.demo.security;
2
+
3
+public class RestAuthenticationEntryPoint {
4
+}

+ 4
- 0
SmartCommunity/SmartCommunityV1/zuul/src/main/java/com/example/demo/security/RestPreAuthenticateProvider.java Bestand weergeven

@@ -0,0 +1,4 @@
1
+package com.example.demo.security;
2
+
3
+public class RestPreAuthenticateProvider {
4
+}

+ 152
- 0
SmartCommunity/SmartCommunityV1/zuul/src/main/java/com/example/demo/security/RestPreAuthenticatedProcessingFilter.java Bestand weergeven

@@ -0,0 +1,152 @@
1
+package com.example.demo.security;
2
+
3
+import ch.qos.logback.core.joran.conditional.ElseAction;
4
+import com.example.demo.config.HttpSessionConfig;
5
+import com.example.demo.config.entity.UserElement;
6
+import com.example.demo.constant.Constants;
7
+import com.example.demo.constant.Header;
8
+import com.example.demo.constant.Status;
9
+import com.example.demo.dto.RoleDTO;
10
+import com.example.demo.entity.ToSysMenu;
11
+import com.example.demo.service.IRoleService;
12
+import com.example.userserver.entity.User;
13
+import org.apache.commons.lang.StringUtils;
14
+import org.springframework.beans.factory.annotation.Autowired;
15
+import org.springframework.security.core.GrantedAuthority;
16
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
17
+import org.springframework.security.web.authentication.preauth.AbstractPreAuthenticatedProcessingFilter;
18
+import org.springframework.util.AntPathMatcher;
19
+
20
+import javax.servlet.http.HttpServletRequest;
21
+import javax.servlet.http.HttpSession;
22
+import java.util.ArrayList;
23
+import java.util.List;
24
+import java.util.stream.Collectors;
25
+
26
+/**
27
+ * 预授权
28
+ * @author weiximei
29
+ */
30
+public class RestAbstractPreAuthenticatedProcessingFilter extends AbstractPreAuthenticatedProcessingFilter {
31
+
32
+    private AntPathMatcher matcher = new AntPathMatcher();
33
+
34
+    private IRoleService iRoleService;
35
+
36
+
37
+    /** 用户类型请求登陆类型 **/
38
+    private String loginType;
39
+
40
+    /**
41
+     * 不需要权限访问的路径
42
+     */
43
+    private List<ToSysMenu> noneSecurity;
44
+
45
+    /**
46
+     * 获取主体信息
47
+     *
48
+     *      1.验证是否有权限
49
+     *      2.授权
50
+     *
51
+     * @param request
52
+     * @return
53
+     */
54
+    @Override
55
+    protected Object getPreAuthenticatedPrincipal(HttpServletRequest request) {
56
+        List<GrantedAuthority> grantedAuthorityList = new ArrayList<>();
57
+        // 不需要的拦截请求处理
58
+        if (isNoneSecurity(request.getRequestURI().toString()) || "OPTIONS".equals(request.getMethod())){
59
+            GrantedAuthority[] authorities = new GrantedAuthority[1];
60
+            GrantedAuthority roleNone = new SimpleGrantedAuthority(Constants.ROLE_NONE);
61
+            authorities[0]=roleNone;
62
+            grantedAuthorityList.add(authorities[0]);
63
+            return new TokenAuthrentication(grantedAuthorityList);
64
+        }
65
+
66
+        isInspection(request);
67
+
68
+        if (null == request.getAttribute(Header.HEADER_ERROR.getValue())){
69
+            try {
70
+                UserElement userElement = getUserElement(loginType, request);
71
+                List<RoleDTO> roleDTOList = iRoleService.getUserRoleByUserId(userElement.getId());
72
+                grantedAuthorityList = roleDTOList.stream()
73
+                        .map(e->new SimpleGrantedAuthority(e.getRoleName().trim()))
74
+                        .collect(Collectors.toList());
75
+            } catch (Exception e){
76
+                System.out.println("用户授权失败!");
77
+                e.printStackTrace();
78
+            }
79
+
80
+        }else {
81
+            // 校验有问题后, 需要给个角色, 让流程继续下去
82
+            GrantedAuthority[] authorities = new GrantedAuthority[1];
83
+            GrantedAuthority roleNone = new SimpleGrantedAuthority("ROLE_NONE");
84
+            authorities[0]=roleNone;
85
+            grantedAuthorityList.add(authorities[0]);
86
+        }
87
+
88
+        return new TokenAuthrentication(grantedAuthorityList);
89
+    }
90
+
91
+
92
+    @Override
93
+    protected Object getPreAuthenticatedCredentials(HttpServletRequest httpServletRequest) {
94
+        return null;
95
+    }
96
+
97
+    /**
98
+     * 验证url是否是不需要权限访问
99
+     * @param url
100
+     * @return
101
+     */
102
+    private boolean isNoneSecurity(String url){
103
+        for (ToSysMenu sysMenu : noneSecurity) {
104
+            if (matcher.match(sysMenu.getMenuUrl(),url)){
105
+                return true;
106
+            }
107
+        }
108
+        return false;
109
+    }
110
+
111
+    /**
112
+     * 检验Token, App版本, 用户登录类型
113
+     * @param request
114
+     */
115
+    private void isInspection(HttpServletRequest request){
116
+        // Token检测
117
+        String token = request.getHeader(Header.REQUEST_X_AUTH_TOKEN.getValue()).trim();
118
+        if (StringUtils.isNotBlank(token)) {
119
+            request.setAttribute(Header.HEADER_ERROR.getValue(), Status.RESPONSE_STATUS_802.getValue());
120
+        }
121
+        // APP版本检测
122
+        String version = request.getHeader(Header.REQUEST_VERSION.getValue()).trim();
123
+        if (StringUtils.isBlank(version)){
124
+            request.setAttribute(Header.HEADER_ERROR.getValue(),Status.RESPONSE_STATUS_800.getValue());
125
+        }
126
+        // 用户登陆类型检测
127
+        loginType = ((String) request.getAttribute(Header.LOGIN_TYPE.getValue())).trim();
128
+        if (StringUtils.isBlank(loginType)) {
129
+            request.setAttribute(Header.HEADER_ERROR.getValue(),Status.RESPONSE_STATUS_801.getValue());
130
+        }
131
+    }
132
+
133
+
134
+    /**
135
+     * 获取用户session信息
136
+     * @param loginType 用户类型
137
+     * @param request
138
+     * @return
139
+     */
140
+    public UserElement getUserElement(String loginType, HttpServletRequest request){
141
+        HttpSession session = request.getSession();
142
+        UserElement userElement = null;
143
+        if ("app".equals(loginType)) {
144
+            userElement = (UserElement) session.getAttribute(Constants.APP_USER_SESSION);
145
+        } else if ("web".equals(loginType)) {
146
+            userElement = (UserElement) session.getAttribute(Constants.WEB_USER_SESSION);
147
+        }
148
+
149
+        return userElement;
150
+    }
151
+
152
+}

+ 26
- 0
SmartCommunity/SmartCommunityV1/zuul/src/main/java/com/example/demo/security/TokenAuthrentication.java Bestand weergeven

@@ -0,0 +1,26 @@
1
+package com.example.demo.security;
2
+
3
+import org.springframework.security.authentication.AbstractAuthenticationToken;
4
+import org.springframework.security.core.GrantedAuthority;
5
+
6
+import java.util.Collection;
7
+
8
+public class SecurityAuthrentication extends AbstractAuthenticationToken {
9
+
10
+    /**
11
+     * 创建权限集合
12
+     */
13
+    public SecurityAuthrentication(Collection<? extends GrantedAuthority> authorities) {
14
+        super(authorities);
15
+    }
16
+
17
+    @Override
18
+    public Object getCredentials() {
19
+        return null;
20
+    }
21
+
22
+    @Override
23
+    public Object getPrincipal() {
24
+        return null;
25
+    }
26
+}

+ 4
- 0
SmartCommunity/SmartCommunityV1/zuul/src/main/java/com/example/demo/service/IRoleService.java Bestand weergeven

@@ -0,0 +1,4 @@
1
+package com.example.demo.service;
2
+
3
+public interface IRoleService {
4
+}

+ 4
- 0
SmartCommunity/SmartCommunityV1/zuul/src/main/java/com/example/demo/service/IUserService.java Bestand weergeven

@@ -0,0 +1,4 @@
1
+package com.example.demo.service;
2
+
3
+public class IUserService {
4
+}

+ 4
- 0
SmartCommunity/SmartCommunityV1/zuul/src/main/java/com/example/demo/service/impl/RoleService.java Bestand weergeven

@@ -0,0 +1,4 @@
1
+package com.example.demo.service.impl;
2
+
3
+public class RoleService {
4
+}

+ 4
- 0
SmartCommunity/SmartCommunityV1/zuul/src/main/java/com/example/demo/service/impl/UserService.java Bestand weergeven

@@ -0,0 +1,4 @@
1
+package com.example.demo.service.impl;
2
+
3
+public class UserService {
4
+}