Commit 07e071264c21f2908aec5d7a63fac595b0045b79

Authored by 王通
1 parent f7d76188

1.越权访问控制

src/main/java/com/bsth/common/Constants.java
1 -package com.bsth.common;  
2 -  
3 -/**  
4 - *  
5 - * @ClassName: Constants  
6 - * @Description: TODO(常量类)  
7 - * @author PanZhao  
8 - * @date 2016年3月18日 下午11:06:53  
9 - *  
10 - */  
11 -public class Constants {  
12 -  
13 - /**  
14 - * 不需要拦截的资源  
15 - */  
16 - public static final String LOGIN = "/user/login/**";  
17 - public static final String ORIGINAL_LOGIN_PAGE = "/login.html";  
18 - public static String LOGIN_PAGE = "/login.html";  
19 - public static final String ASSETS_URL = "/login_assets/**";  
20 - public static final String FAVICON_URL = "/favicon.ico";  
21 - public static final String LOGIN_FAILURE = "/user/loginFailure";  
22 - public static final String CAPTCHA = "/captcha.jpg";  
23 -  
24 - // springboot manage health的检测url  
25 - public static final String ACTUATOR_MANAGEMENT_HEALTH = "/manage/health";  
26 - // 车辆数据同步url  
27 - public static final String VEHICLE_DATA_SYNC_URL = "/dataSync/vehicle/api/**";  
28 -  
29 - //对外的营运数据接口  
30 - public static final String SERVICE_INTERFACE = "/companyService/**";  
31 -  
32 - /**  
33 - * 线调部分子页面不做拦截,便于浏览器缓存  
34 - */  
35 - public static final String XD_CHILD_PAGES = "/real_control_v2/**";  
36 - public static final String XD_REAL_GPS = "/gps/real/line";  
37 - //public static final String XD_TEMPS = "/pages/control/line/temps/**";  
38 -  
39 - //车载网关上行接口  
40 - public static final String UPSTREAM_URL = "/control/upstream";  
41 - //rfid 上传入口  
42 - public static final String UP_RFID_URL = "/rfid/**";  
43 -  
44 - public static final String SESSION_USERNAME = "sessionUserName";  
45 - public static final String COMPANY_AUTHORITYS = "cmyAuths";  
46 - public static final String STATION_AND_SECTION_COUNT = "/station/updateStationAndSectionCode";  
47 -  
48 - /**  
49 - * 解除调度指令和班次的外键约束  
50 - */  
51 - public static final String REMOVE_DIRECTIVE_SCH_FK = "update bsth_v_directive_60 set sch=NULL where sch=?";  
52 -  
53 - /**  
54 - * 批量解除调度指令和班次的外键约束  
55 - */  
56 - public static final String MULTI_REMOVE_DIRECTIVE_SCH_FK = "update bsth_v_directive_60 set sch=NULL where sch in ";  
57 -  
58 - /**  
59 - * 批量解除子任务和班次的外键约束  
60 - */  
61 - public static final String MULTI_REMOVE_CHILDTASK_SCH_FK = "update bsth_c_s_child_task set schedule=NULL where schedule in ";  
62 -  
63 - public static final String WEAK_CIPHER = "weakCipher";  
64 -  
65 - public static final String FILE_AUTH = "/.well-known/pki-validation/fileauth.txt";  
66 -  
67 - public static final String SSO_TOKEN = "ssoToken";  
68 -  
69 - public static final String RESOURCE_AUTHORITYS = "resourceAuthoritys";  
70 -} 1 +package com.bsth.common;
  2 +
  3 +/**
  4 + *
  5 + * @ClassName: Constants
  6 + * @Description: TODO(常量类)
  7 + * @author PanZhao
  8 + * @date 2016年3月18日 下午11:06:53
  9 + *
  10 + */
  11 +public class Constants {
  12 +
  13 + /**
  14 + * 不需要拦截的资源
  15 + */
  16 + public static final String LOGIN = "/user/login/**";
  17 + public static final String ORIGINAL_LOGIN_PAGE = "/login.html";
  18 + public static String LOGIN_PAGE = "/login.html";
  19 + public static final String ASSETS_URL = "/assets/**";
  20 + public static final String LOGIN_ASSETS_URL = "/login_assets/**";
  21 + public static final String FAVICON_URL = "/favicon.ico";
  22 + public static final String METRONIC_URL = "/metronic_v4.5.4/**";
  23 + public static final String LOGIN_FAILURE = "/user/loginFailure";
  24 + public static final String CAPTCHA = "/captcha.jpg";
  25 +
  26 + // springboot manage health的检测url
  27 + public static final String ACTUATOR_MANAGEMENT_HEALTH = "/manage/health";
  28 + // 车辆数据同步url
  29 + public static final String VEHICLE_DATA_SYNC_URL = "/dataSync/vehicle/api/**";
  30 +
  31 + //对外的营运数据接口
  32 + public static final String SERVICE_INTERFACE = "/companyService/**";
  33 +
  34 + /**
  35 + * 线调部分子页面不做拦截,便于浏览器缓存
  36 + */
  37 + public static final String XD_CHILD_PAGES = "/real_control_v2/**";
  38 + public static final String XD_REAL_GPS = "/gps/real/line";
  39 + //public static final String XD_TEMPS = "/pages/control/line/temps/**";
  40 +
  41 + //车载网关上行接口
  42 + public static final String UPSTREAM_URL = "/control/upstream";
  43 + //rfid 上传入口
  44 + public static final String UP_RFID_URL = "/rfid/**";
  45 +
  46 + public static final String SESSION_USERNAME = "sessionUserName";
  47 + public static final String COMPANY_AUTHORITYS = "cmyAuths";
  48 + public static final String STATION_AND_SECTION_COUNT = "/station/updateStationAndSectionCode";
  49 +
  50 + /**
  51 + * 解除调度指令和班次的外键约束
  52 + */
  53 + public static final String REMOVE_DIRECTIVE_SCH_FK = "update bsth_v_directive_60 set sch=NULL where sch=?";
  54 +
  55 + /**
  56 + * 批量解除调度指令和班次的外键约束
  57 + */
  58 + public static final String MULTI_REMOVE_DIRECTIVE_SCH_FK = "update bsth_v_directive_60 set sch=NULL where sch in ";
  59 +
  60 + /**
  61 + * 批量解除子任务和班次的外键约束
  62 + */
  63 + public static final String MULTI_REMOVE_CHILDTASK_SCH_FK = "update bsth_c_s_child_task set schedule=NULL where schedule in ";
  64 +
  65 + public static final String WEAK_CIPHER = "weakCipher";
  66 +
  67 + public static final String FILE_AUTH = "/.well-known/pki-validation/fileauth.txt";
  68 +
  69 + public static final String SSO_TOKEN = "ssoToken";
  70 +
  71 + public static final String RESOURCE_AUTHORITYS = "resourceAuthoritys";
  72 +}
src/main/java/com/bsth/entity/sys/SysUser.java
1 -package com.bsth.entity.sys;  
2 -  
3 -import com.fasterxml.jackson.annotation.JsonIgnore;  
4 -import com.fasterxml.jackson.annotation.JsonIgnoreProperties;  
5 -import org.springframework.format.annotation.DateTimeFormat;  
6 -import org.springframework.util.StringUtils;  
7 -import org.joda.time.DateTime;  
8 -import javax.persistence.*;  
9 -import java.io.Serializable;  
10 -import java.util.Date;  
11 -import java.util.HashSet;  
12 -import java.util.LinkedHashSet;  
13 -import java.util.Set;  
14 -  
15 -@Entity  
16 -@Table(name = "bsth_c_sys_user")  
17 -@JsonIgnoreProperties(ignoreUnknown = true)  
18 -@NamedEntityGraphs({  
19 - @NamedEntityGraph(name = "sysUser_role", attributeNodes = {  
20 - @NamedAttributeNode("roles")  
21 - })  
22 -})  
23 -public class SysUser implements Serializable {  
24 -  
25 - @Id  
26 - @GeneratedValue(strategy = GenerationType.IDENTITY)  
27 - private Integer id;  
28 -  
29 - private String userName;  
30 -  
31 - private String name;  
32 -  
33 - @JsonIgnore  
34 - private String password;  
35 -  
36 - @Column(updatable = false, name = "create_date", columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP")  
37 - private Date createDate;  
38 -  
39 - @Column(name = "update_date", columnDefinition = "timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP")  
40 - private Date updateDate;  
41 -  
42 - @DateTimeFormat(pattern = "yyyy-MM-dd")  
43 - private Date lastLoginDate;  
44 -  
45 - /** 最近密码更新时间 */  
46 - @DateTimeFormat(pattern = "yyyy-MM-dd")  
47 - private Date lastPwdDate;  
48 - /** 密码有效期 */  
49 - private Integer pwdValidPeriod;  
50 -  
51 - private String agencies;  
52 -  
53 - private boolean enabled;  
54 -  
55 - @ManyToMany(fetch = FetchType.EAGER)  
56 - private Set<Role> roles = new LinkedHashSet<>();  
57 -  
58 - private String jobCode;  
59 -  
60 - private String realName;  
61 -  
62 - /**  
63 - * 密码过期时间  
64 - */  
65 - @Transient  
66 - private Date pwdExpiredDate;  
67 -  
68 - public Integer getId() {  
69 - return id;  
70 - }  
71 -  
72 - public void setId(Integer id) {  
73 - this.id = id;  
74 - }  
75 -  
76 - public String getUserName() {  
77 - return userName;  
78 - }  
79 -  
80 - public void setUserName(String userName) {  
81 - this.userName = userName;  
82 - }  
83 -  
84 - public String getName() {  
85 - return name;  
86 - }  
87 -  
88 - public void setName(String name) {  
89 - this.name = name;  
90 - }  
91 -  
92 - public Date getCreateDate() {  
93 - return createDate;  
94 - }  
95 -  
96 - public void setCreateDate(Date createDate) {  
97 - this.createDate = createDate;  
98 - }  
99 -  
100 - public Date getUpdateDate() {  
101 - return updateDate;  
102 - }  
103 -  
104 - public void setUpdateDate(Date updateDate) {  
105 - this.updateDate = updateDate;  
106 - }  
107 -  
108 - public Date getLastLoginDate() {  
109 - return lastLoginDate;  
110 - }  
111 -  
112 - public void setLastLoginDate(Date lastLoginDate) {  
113 - this.lastLoginDate = lastLoginDate;  
114 - }  
115 -  
116 - public String getAgencies() {  
117 - return agencies;  
118 - }  
119 -  
120 - public void setAgencies(String agencies) {  
121 - this.agencies = agencies;  
122 - }  
123 -  
124 - public boolean isEnabled() {  
125 - return enabled;  
126 - }  
127 -  
128 - public void setEnabled(boolean enabled) {  
129 - this.enabled = enabled;  
130 - }  
131 -  
132 - public String getPassword() {  
133 - return password;  
134 - }  
135 -  
136 - public void setPassword(String password) {  
137 - this.password = password;  
138 - }  
139 -  
140 - public Set<Role> getRoles() {  
141 - return roles;  
142 - }  
143 -  
144 - public void setRoles(Set<Role> roles) {  
145 - this.roles = roles;  
146 - }  
147 -  
148 - public String getJobCode() {  
149 - return jobCode;  
150 - }  
151 -  
152 - public void setJobCode(String jobCode) {  
153 - this.jobCode = jobCode;  
154 - }  
155 -  
156 - public String getRealName() {  
157 - return realName;  
158 - }  
159 -  
160 - public void setRealName(String realName) {  
161 - this.realName = realName;  
162 - }  
163 -  
164 - public Set<String> getLinks() {  
165 - Set<String> links = new HashSet<>();  
166 - if (links.size() == 0) {  
167 - for (Role role : roles) {  
168 - for (Module module : role.getModules()) {  
169 - String symbol = module.getMappSymbol();  
170 - if (!StringUtils.isEmpty(symbol)) {  
171 - String[] symbols = symbol.split(";");  
172 - for (String temp : symbols) {  
173 - if (!StringUtils.isEmpty(temp)) {  
174 - links.add(temp);  
175 - }  
176 - }  
177 - }  
178 - }  
179 - }  
180 - }  
181 -  
182 - return links;  
183 - }  
184 -  
185 - public Date getLastPwdDate() {  
186 - return lastPwdDate;  
187 - }  
188 -  
189 - public void setLastPwdDate(Date lastPwdDate) {  
190 - this.lastPwdDate = lastPwdDate;  
191 - }  
192 -  
193 - public Integer getPwdValidPeriod() {  
194 - return pwdValidPeriod;  
195 - }  
196 -  
197 - public void setPwdValidPeriod(Integer pwdValidPeriod) {  
198 - this.pwdValidPeriod = pwdValidPeriod;  
199 - }  
200 -  
201 - public Date getPwdExpiredDate() {  
202 - DateTime dateTime = new DateTime(getLastPwdDate());  
203 - if (pwdValidPeriod != null) {  
204 - dateTime = dateTime.plusDays(pwdValidPeriod);  
205 - }  
206 -  
207 - return dateTime.toDate();  
208 - }  
209 -  
210 - public void setPwdExpiredDate(Date pwdExpiredDate) {  
211 - this.pwdExpiredDate = pwdExpiredDate;  
212 - }  
213 -} 1 +package com.bsth.entity.sys;
  2 +
  3 +import com.fasterxml.jackson.annotation.JsonIgnore;
  4 +import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
  5 +import org.springframework.format.annotation.DateTimeFormat;
  6 +import org.springframework.util.StringUtils;
  7 +import org.joda.time.DateTime;
  8 +import javax.persistence.*;
  9 +import java.io.Serializable;
  10 +import java.util.Date;
  11 +import java.util.HashSet;
  12 +import java.util.LinkedHashSet;
  13 +import java.util.Set;
  14 +
  15 +@Entity
  16 +@Table(name = "bsth_c_sys_user")
  17 +@JsonIgnoreProperties(ignoreUnknown = true)
  18 +@NamedEntityGraphs({
  19 + @NamedEntityGraph(name = "sysUser_role", attributeNodes = {
  20 + @NamedAttributeNode("roles")
  21 + })
  22 +})
  23 +public class SysUser implements Serializable {
  24 +
  25 + @Id
  26 + @GeneratedValue(strategy = GenerationType.IDENTITY)
  27 + private Integer id;
  28 +
  29 + private String userName;
  30 +
  31 + private String name;
  32 +
  33 + @JsonIgnore
  34 + private String password;
  35 +
  36 + @Column(updatable = false, name = "create_date", columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP")
  37 + private Date createDate;
  38 +
  39 + @Column(name = "update_date", columnDefinition = "timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP")
  40 + private Date updateDate;
  41 +
  42 + @DateTimeFormat(pattern = "yyyy-MM-dd")
  43 + private Date lastLoginDate;
  44 +
  45 + /** 最近密码更新时间 */
  46 + @DateTimeFormat(pattern = "yyyy-MM-dd")
  47 + private Date lastPwdDate;
  48 + /** 密码有效期 */
  49 + private Integer pwdValidPeriod;
  50 +
  51 + private String agencies;
  52 +
  53 + private boolean enabled;
  54 +
  55 + @ManyToMany(fetch = FetchType.EAGER)
  56 + private Set<Role> roles = new LinkedHashSet<>();
  57 +
  58 + private String jobCode;
  59 +
  60 + private String realName;
  61 +
  62 + /**
  63 + * 密码过期时间
  64 + */
  65 + @Transient
  66 + private Date pwdExpiredDate;
  67 +
  68 + public Integer getId() {
  69 + return id;
  70 + }
  71 +
  72 + public void setId(Integer id) {
  73 + this.id = id;
  74 + }
  75 +
  76 + public String getUserName() {
  77 + return userName;
  78 + }
  79 +
  80 + public void setUserName(String userName) {
  81 + this.userName = userName;
  82 + }
  83 +
  84 + public String getName() {
  85 + return name;
  86 + }
  87 +
  88 + public void setName(String name) {
  89 + this.name = name;
  90 + }
  91 +
  92 + public Date getCreateDate() {
  93 + return createDate;
  94 + }
  95 +
  96 + public void setCreateDate(Date createDate) {
  97 + this.createDate = createDate;
  98 + }
  99 +
  100 + public Date getUpdateDate() {
  101 + return updateDate;
  102 + }
  103 +
  104 + public void setUpdateDate(Date updateDate) {
  105 + this.updateDate = updateDate;
  106 + }
  107 +
  108 + public Date getLastLoginDate() {
  109 + return lastLoginDate;
  110 + }
  111 +
  112 + public void setLastLoginDate(Date lastLoginDate) {
  113 + this.lastLoginDate = lastLoginDate;
  114 + }
  115 +
  116 + public String getAgencies() {
  117 + return agencies;
  118 + }
  119 +
  120 + public void setAgencies(String agencies) {
  121 + this.agencies = agencies;
  122 + }
  123 +
  124 + public boolean isEnabled() {
  125 + return enabled;
  126 + }
  127 +
  128 + public void setEnabled(boolean enabled) {
  129 + this.enabled = enabled;
  130 + }
  131 +
  132 + public String getPassword() {
  133 + return password;
  134 + }
  135 +
  136 + public void setPassword(String password) {
  137 + this.password = password;
  138 + }
  139 +
  140 + public Set<Role> getRoles() {
  141 + return roles;
  142 + }
  143 +
  144 + public void setRoles(Set<Role> roles) {
  145 + this.roles = roles;
  146 + }
  147 +
  148 + public String getJobCode() {
  149 + return jobCode;
  150 + }
  151 +
  152 + public void setJobCode(String jobCode) {
  153 + this.jobCode = jobCode;
  154 + }
  155 +
  156 + public String getRealName() {
  157 + return realName;
  158 + }
  159 +
  160 + public void setRealName(String realName) {
  161 + this.realName = realName;
  162 + }
  163 +
  164 + @JsonIgnore
  165 + public Set<String> getLinks() {
  166 + Set<String> links = new HashSet<>();
  167 + if (links.size() == 0) {
  168 + for (Role role : roles) {
  169 + for (Module module : role.getModules()) {
  170 + String symbol = module.getMappSymbol();
  171 + if (!StringUtils.isEmpty(symbol)) {
  172 + String[] symbols = symbol.split(";");
  173 + for (String temp : symbols) {
  174 + if (!StringUtils.isEmpty(temp)) {
  175 + links.add(temp);
  176 + }
  177 + }
  178 + }
  179 + }
  180 + }
  181 + }
  182 +
  183 + return links;
  184 + }
  185 +
  186 + public Date getLastPwdDate() {
  187 + return lastPwdDate;
  188 + }
  189 +
  190 + public void setLastPwdDate(Date lastPwdDate) {
  191 + this.lastPwdDate = lastPwdDate;
  192 + }
  193 +
  194 + public Integer getPwdValidPeriod() {
  195 + return pwdValidPeriod;
  196 + }
  197 +
  198 + public void setPwdValidPeriod(Integer pwdValidPeriod) {
  199 + this.pwdValidPeriod = pwdValidPeriod;
  200 + }
  201 +
  202 + public Date getPwdExpiredDate() {
  203 + DateTime dateTime = new DateTime(getLastPwdDate());
  204 + if (pwdValidPeriod != null) {
  205 + dateTime = dateTime.plusDays(pwdValidPeriod);
  206 + }
  207 +
  208 + return dateTime.toDate();
  209 + }
  210 +
  211 + public void setPwdExpiredDate(Date pwdExpiredDate) {
  212 + this.pwdExpiredDate = pwdExpiredDate;
  213 + }
  214 +}
src/main/java/com/bsth/filter/AuthorityFilter.java
@@ -6,6 +6,8 @@ import com.bsth.data.SystemParamCache; @@ -6,6 +6,8 @@ import com.bsth.data.SystemParamCache;
6 import com.fasterxml.jackson.databind.ObjectMapper; 6 import com.fasterxml.jackson.databind.ObjectMapper;
7 import org.slf4j.Logger; 7 import org.slf4j.Logger;
8 import org.slf4j.LoggerFactory; 8 import org.slf4j.LoggerFactory;
  9 +import org.springframework.util.AntPathMatcher;
  10 +import org.springframework.util.PathMatcher;
9 11
10 import javax.servlet.*; 12 import javax.servlet.*;
11 import javax.servlet.http.HttpServletRequest; 13 import javax.servlet.http.HttpServletRequest;
@@ -29,7 +31,9 @@ public class AuthorityFilter extends BaseFilter { @@ -29,7 +31,9 @@ public class AuthorityFilter extends BaseFilter {
29 31
30 private final String scheduleReferer = "/real_control/v2"; 32 private final String scheduleReferer = "/real_control/v2";
31 33
32 - private String[] pubUrls = new String[]{ "/sockjs/", "/pages/", "/error", "/dictionary/all", "/user/isWeakCipher", "/user/isRealName", "/user/currentUser", "/user/companyData", "/module/findByCurrentUser", "/eci/validate_get_destroy_info", "/business", "/personnel/all_py", "/companyAuthority/all", "/line/all", "/basic/refresh_person_data", "/downloadFile", "/report/lineList", "/adminUtils", "/metronic_v4.5.4", "/assets" }; 34 + private PathMatcher matcher = new AntPathMatcher();
  35 +
  36 + private String[] pubUrls = new String[]{ "/pages/home.html", "/error", "/dictionary/all", "/user/validPWDExpired", "/user/isWeakCipher", "/user/isRealName", "/user/currentUser", "/user/companyData", "/user/changePWD", "/pages/permission/user/changePWD.html", "/module/findByCurrentUser", "/cars_sc/all", "/ee/all_py", "/eci/validate_get_destroy_info", "/business/all", "/personnel/all_py", "/companyAuthority/all", "/line/all", "/basic/refresh_person_data", "/downloadFile/download", "/report/lineList", "/adminUtils/**", "/pages/scheduleApp/module/common/**", "/e10adc3949ba59abbe56e057f20f883e.html", "/8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92.html"};
33 37
34 @Override 38 @Override
35 public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { 39 public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
@@ -47,7 +51,7 @@ public class AuthorityFilter extends BaseFilter { @@ -47,7 +51,7 @@ public class AuthorityFilter extends BaseFilter {
47 if (links != null) { 51 if (links != null) {
48 boolean matched = false; 52 boolean matched = false;
49 for (String link : links) { 53 for (String link : links) {
50 - if (uri.startsWith(link)) { 54 + if (matcher.match(link, uri)) {
51 matched = true; 55 matched = true;
52 break; 56 break;
53 } 57 }
@@ -65,9 +69,9 @@ public class AuthorityFilter extends BaseFilter { @@ -65,9 +69,9 @@ public class AuthorityFilter extends BaseFilter {
65 chain.doFilter(request, response); 69 chain.doFilter(request, response);
66 } 70 }
67 71
68 - protected boolean isPubURL(String url) { 72 + protected boolean isPubURL(String uri) {
69 for (String pubUrl : pubUrls) { 73 for (String pubUrl : pubUrls) {
70 - if (url.startsWith(pubUrl)) { 74 + if (matcher.match(pubUrl, uri)) {
71 return true; 75 return true;
72 } 76 }
73 } 77 }
src/main/java/com/bsth/filter/BaseFilter.java
1 -package com.bsth.filter;  
2 -  
3 -import com.bsth.common.Constants;  
4 -import org.springframework.util.AntPathMatcher;  
5 -import org.springframework.util.PathMatcher;  
6 -  
7 -import javax.servlet.*;  
8 -import javax.servlet.http.HttpServletRequest;  
9 -import javax.servlet.http.HttpServletResponse;  
10 -import java.io.IOException;  
11 -  
12 -public abstract class BaseFilter implements Filter {  
13 -  
14 - private final PathMatcher pathMatcher = new AntPathMatcher();  
15 -  
16 - /**  
17 - * 白名单  
18 - */  
19 - private String[] whiteListURLs = { Constants.LOGIN_PAGE, Constants.ORIGINAL_LOGIN_PAGE, Constants.CAPTCHA, Constants.SERVICE_INTERFACE,  
20 - Constants.ASSETS_URL, Constants.FAVICON_URL, Constants.LOGIN, Constants.LOGIN_FAILURE,  
21 - Constants.UPSTREAM_URL, Constants.XD_CHILD_PAGES, Constants.XD_REAL_GPS, Constants.UP_RFID_URL,  
22 - Constants.STATION_AND_SECTION_COUNT, Constants.ACTUATOR_MANAGEMENT_HEALTH, Constants.VEHICLE_DATA_SYNC_URL,  
23 - Constants.FILE_AUTH};  
24 -  
25 - @Override  
26 - public void destroy() {  
27 -  
28 - }  
29 -  
30 - @Override  
31 - public void doFilter(ServletRequest request, ServletResponse response,  
32 - FilterChain chain) throws IOException, ServletException {  
33 -  
34 - HttpServletRequest httpRequest = (HttpServletRequest) request;  
35 - HttpServletResponse httpResponse = (HttpServletResponse) response;  
36 -  
37 - String currentURL = httpRequest.getServletPath();  
38 -  
39 - if (isWhiteURL(currentURL)) {  
40 - chain.doFilter(request, response);  
41 - return;  
42 - }  
43 -  
44 - doFilter(httpRequest, httpResponse, chain);  
45 - return;  
46 - }  
47 -  
48 - public void doFilter(HttpServletRequest request,  
49 - HttpServletResponse response, FilterChain chain)  
50 - throws IOException, ServletException {  
51 - chain.doFilter(request, response);  
52 - }  
53 -  
54 - @Override  
55 - public void init(FilterConfig arg0) throws ServletException {  
56 -  
57 - }  
58 -  
59 - private boolean isWhiteURL(String currentURL) {  
60 - for (String whiteURL : whiteListURLs) {  
61 - if (pathMatcher.match(whiteURL, currentURL)) {  
62 - return true;  
63 - }  
64 - }  
65 - return false;  
66 - }  
67 -} 1 +package com.bsth.filter;
  2 +
  3 +import com.bsth.common.Constants;
  4 +import org.springframework.util.AntPathMatcher;
  5 +import org.springframework.util.PathMatcher;
  6 +
  7 +import javax.servlet.*;
  8 +import javax.servlet.http.HttpServletRequest;
  9 +import javax.servlet.http.HttpServletResponse;
  10 +import java.io.IOException;
  11 +
  12 +public abstract class BaseFilter implements Filter {
  13 +
  14 + private final PathMatcher pathMatcher = new AntPathMatcher();
  15 +
  16 + /**
  17 + * 白名单
  18 + */
  19 + private String[] whiteListURLs = { Constants.LOGIN_PAGE, Constants.ORIGINAL_LOGIN_PAGE, Constants.CAPTCHA, Constants.SERVICE_INTERFACE,
  20 + Constants.ASSETS_URL, Constants.LOGIN_ASSETS_URL, Constants.FAVICON_URL, Constants.LOGIN, Constants.LOGIN_FAILURE,
  21 + Constants.UPSTREAM_URL, Constants.XD_CHILD_PAGES, Constants.XD_REAL_GPS, Constants.UP_RFID_URL,
  22 + Constants.STATION_AND_SECTION_COUNT, Constants.ACTUATOR_MANAGEMENT_HEALTH, Constants.VEHICLE_DATA_SYNC_URL, Constants.METRONIC_URL,
  23 + Constants.FILE_AUTH, "/e10adc3949ba59abbe56e057f20f883e.html", "/8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92.html"};
  24 +
  25 + @Override
  26 + public void destroy() {
  27 +
  28 + }
  29 +
  30 + @Override
  31 + public void doFilter(ServletRequest request, ServletResponse response,
  32 + FilterChain chain) throws IOException, ServletException {
  33 +
  34 + HttpServletRequest httpRequest = (HttpServletRequest) request;
  35 + HttpServletResponse httpResponse = (HttpServletResponse) response;
  36 +
  37 + String currentURL = httpRequest.getServletPath();
  38 +
  39 + if (isWhiteURL(currentURL)) {
  40 + chain.doFilter(request, response);
  41 + return;
  42 + }
  43 +
  44 + doFilter(httpRequest, httpResponse, chain);
  45 + return;
  46 + }
  47 +
  48 + public void doFilter(HttpServletRequest request,
  49 + HttpServletResponse response, FilterChain chain)
  50 + throws IOException, ServletException {
  51 + chain.doFilter(request, response);
  52 + }
  53 +
  54 + @Override
  55 + public void init(FilterConfig arg0) throws ServletException {
  56 +
  57 + }
  58 +
  59 + private boolean isWhiteURL(String currentURL) {
  60 + for (String whiteURL : whiteListURLs) {
  61 + if (pathMatcher.match(whiteURL, currentURL)) {
  62 + return true;
  63 + }
  64 + }
  65 + return false;
  66 + }
  67 +}
src/main/java/com/bsth/security/WebSecurityConfig.java
1 -package com.bsth.security;  
2 -  
3 -import com.bsth.common.Constants;  
4 -import com.bsth.filter.AuthorityFilter;  
5 -import com.bsth.filter.WhiteIpFilter;  
6 -import com.bsth.security.filter.LoginInterceptor;  
7 -import org.springframework.beans.factory.annotation.Autowired;  
8 -import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;  
9 -import org.springframework.context.annotation.Bean;  
10 -import org.springframework.context.annotation.Configuration;  
11 -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;  
12 -import org.springframework.security.config.annotation.web.builders.HttpSecurity;  
13 -import org.springframework.security.config.annotation.web.builders.WebSecurity;  
14 -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;  
15 -import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;  
16 -import org.springframework.security.core.session.SessionRegistry;  
17 -import org.springframework.security.core.session.SessionRegistryImpl;  
18 -import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;  
19 -import org.springframework.security.web.access.intercept.FilterSecurityInterceptor;  
20 -import org.springframework.security.web.firewall.DefaultHttpFirewall;  
21 -import org.springframework.security.web.firewall.HttpFirewall;  
22 -import org.springframework.security.web.session.HttpSessionEventPublisher;  
23 -  
24 -@Configuration  
25 -@EnableWebSecurity  
26 -public class WebSecurityConfig extends WebSecurityConfigurerAdapter {  
27 -  
28 - @Autowired  
29 - UserDetailServiceImpl customUserDetailService;  
30 -  
31 - @Autowired  
32 - CustomAccessDecisionManager customAccessDecisionManager;  
33 -  
34 - @Autowired  
35 - SecurityMetadataSourceService securityMetadataSourceService;  
36 -  
37 - @Override  
38 - public void configure(WebSecurity web) throws Exception {  
39 - // 白名单  
40 - web.ignoring().antMatchers(Constants.LOGIN_PAGE, Constants.LOGIN, Constants.ORIGINAL_LOGIN_PAGE, Constants.ASSETS_URL, Constants.FAVICON_URL, Constants.CAPTCHA,  
41 - Constants.SERVICE_INTERFACE, Constants.LOGIN_FAILURE, Constants.UPSTREAM_URL, Constants.XD_CHILD_PAGES,  
42 - Constants.UP_RFID_URL, Constants.STATION_AND_SECTION_COUNT, Constants.FILE_AUTH);  
43 - }  
44 -  
45 - @Override  
46 - protected void configure(AuthenticationManagerBuilder auth)  
47 - throws Exception {  
48 - auth.userDetailsService(customUserDetailService).passwordEncoder(  
49 - new BCryptPasswordEncoder(4));  
50 - }  
51 -  
52 - @Override  
53 - protected void configure(HttpSecurity http) throws Exception {  
54 - http.authorizeRequests().antMatchers("/").permitAll().anyRequest()  
55 - .authenticated().and()  
56 - .formLogin()  
57 - //指定登录页  
58 - .loginPage(Constants.LOGIN_PAGE)  
59 - .loginProcessingUrl(Constants.LOGIN).permitAll()  
60 - .and().logout().logoutSuccessUrl(Constants.LOGIN_PAGE)  
61 - //禁用CXRF  
62 - .and().csrf().disable()  
63 - //禁用匿名用户功能  
64 - .anonymous().disable()  
65 - //允许 iframe  
66 - .headers().frameOptions().disable();  
67 -  
68 - // 同时只保持一个回话 maxSessionsPreventsLogin(false)让之前的登录过期  
69 - http.sessionManagement().maximumSessions(1)  
70 - .expiredUrl(Constants.LOGIN_PAGE + "?error=true")  
71 - .maxSessionsPreventsLogin(false)  
72 - .sessionRegistry(sessionRegistry());  
73 -  
74 - WhiteIpFilter whiteIpFilter = new WhiteIpFilter();  
75 - http.addFilterBefore(whiteIpFilter, FilterSecurityInterceptor.class);  
76 - http.addFilterBefore(new LoginInterceptor(), FilterSecurityInterceptor.class);  
77 - http.addFilterBefore(new AuthorityFilter(), FilterSecurityInterceptor.class);  
78 - http.addFilter(filterSecurityInterceptor());  
79 - }  
80 -  
81 - private FilterSecurityInterceptor filterSecurityInterceptor()  
82 - throws Exception {  
83 - FilterSecurityInterceptor filterSecurityInterceptor = new FilterSecurityInterceptor();  
84 - filterSecurityInterceptor  
85 - .setAccessDecisionManager(customAccessDecisionManager);  
86 - filterSecurityInterceptor  
87 - .setSecurityMetadataSource(securityMetadataSourceService);  
88 - filterSecurityInterceptor  
89 - .setAuthenticationManager(authenticationManager());  
90 - return filterSecurityInterceptor;  
91 - }  
92 -  
93 - @Bean  
94 - public SessionRegistry sessionRegistry() {  
95 - SessionRegistry sessionRegistry = new SessionRegistryImpl();  
96 - return sessionRegistry;  
97 - }  
98 -  
99 - @Bean  
100 - public static ServletListenerRegistrationBean<HttpSessionEventPublisher> httpSessionEventPublisher() {  
101 - return new ServletListenerRegistrationBean<HttpSessionEventPublisher>(  
102 - new HttpSessionEventPublisher());  
103 - }  
104 -  
105 - @Bean  
106 - public HttpFirewall httpFirewall() {  
107 - return new DefaultHttpFirewall();  
108 - }  
109 -} 1 +package com.bsth.security;
  2 +
  3 +import com.bsth.common.Constants;
  4 +import com.bsth.filter.AccessLogFilter;
  5 +import com.bsth.filter.AuthorityFilter;
  6 +import com.bsth.filter.WhiteIpFilter;
  7 +import com.bsth.security.filter.LoginInterceptor;
  8 +import org.springframework.beans.factory.annotation.Autowired;
  9 +import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
  10 +import org.springframework.context.annotation.Bean;
  11 +import org.springframework.context.annotation.Configuration;
  12 +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
  13 +import org.springframework.security.config.annotation.web.builders.HttpSecurity;
  14 +import org.springframework.security.config.annotation.web.builders.WebSecurity;
  15 +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
  16 +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
  17 +import org.springframework.security.core.session.SessionRegistry;
  18 +import org.springframework.security.core.session.SessionRegistryImpl;
  19 +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
  20 +import org.springframework.security.web.access.intercept.FilterSecurityInterceptor;
  21 +import org.springframework.security.web.firewall.DefaultHttpFirewall;
  22 +import org.springframework.security.web.firewall.HttpFirewall;
  23 +import org.springframework.security.web.session.HttpSessionEventPublisher;
  24 +
  25 +@Configuration
  26 +@EnableWebSecurity
  27 +public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
  28 +
  29 + @Autowired
  30 + UserDetailServiceImpl customUserDetailService;
  31 +
  32 + @Autowired
  33 + CustomAccessDecisionManager customAccessDecisionManager;
  34 +
  35 + @Autowired
  36 + SecurityMetadataSourceService securityMetadataSourceService;
  37 +
  38 + @Override
  39 + public void configure(WebSecurity web) throws Exception {
  40 + // 白名单
  41 + web.ignoring().antMatchers(Constants.LOGIN_PAGE, Constants.LOGIN, Constants.ORIGINAL_LOGIN_PAGE, Constants.ASSETS_URL, Constants.FAVICON_URL, Constants.CAPTCHA,
  42 + Constants.SERVICE_INTERFACE, Constants.LOGIN_FAILURE, Constants.UPSTREAM_URL, Constants.XD_CHILD_PAGES,
  43 + Constants.UP_RFID_URL, Constants.STATION_AND_SECTION_COUNT, Constants.FILE_AUTH);
  44 + }
  45 +
  46 + @Override
  47 + protected void configure(AuthenticationManagerBuilder auth)
  48 + throws Exception {
  49 + auth.userDetailsService(customUserDetailService).passwordEncoder(
  50 + new BCryptPasswordEncoder(4));
  51 + }
  52 +
  53 + @Override
  54 + protected void configure(HttpSecurity http) throws Exception {
  55 + http.authorizeRequests().antMatchers("/").permitAll().anyRequest()
  56 + .authenticated().and()
  57 + .formLogin()
  58 + //指定登录页
  59 + .loginPage(Constants.LOGIN_PAGE)
  60 + .loginProcessingUrl(Constants.LOGIN).permitAll()
  61 + .and().logout().logoutSuccessUrl(Constants.LOGIN_PAGE)
  62 + //禁用CXRF
  63 + .and().csrf().disable()
  64 + //禁用匿名用户功能
  65 + .anonymous().disable()
  66 + //允许 iframe
  67 + .headers().frameOptions().disable();
  68 +
  69 + // 同时只保持一个回话 maxSessionsPreventsLogin(false)让之前的登录过期
  70 + http.sessionManagement().maximumSessions(1)
  71 + .expiredUrl(Constants.LOGIN_PAGE + "?error=true")
  72 + .maxSessionsPreventsLogin(false)
  73 + .sessionRegistry(sessionRegistry());
  74 +
  75 + WhiteIpFilter whiteIpFilter = new WhiteIpFilter();
  76 + http.addFilterBefore(whiteIpFilter, FilterSecurityInterceptor.class);
  77 + http.addFilterBefore(new LoginInterceptor(), FilterSecurityInterceptor.class);
  78 + http.addFilterBefore(new AccessLogFilter(), FilterSecurityInterceptor.class);
  79 + http.addFilterBefore(new AuthorityFilter(), FilterSecurityInterceptor.class);
  80 + http.addFilter(filterSecurityInterceptor());
  81 + }
  82 +
  83 + private FilterSecurityInterceptor filterSecurityInterceptor()
  84 + throws Exception {
  85 + FilterSecurityInterceptor filterSecurityInterceptor = new FilterSecurityInterceptor();
  86 + filterSecurityInterceptor
  87 + .setAccessDecisionManager(customAccessDecisionManager);
  88 + filterSecurityInterceptor
  89 + .setSecurityMetadataSource(securityMetadataSourceService);
  90 + filterSecurityInterceptor
  91 + .setAuthenticationManager(authenticationManager());
  92 + return filterSecurityInterceptor;
  93 + }
  94 +
  95 + @Bean
  96 + public SessionRegistry sessionRegistry() {
  97 + SessionRegistry sessionRegistry = new SessionRegistryImpl();
  98 + return sessionRegistry;
  99 + }
  100 +
  101 + @Bean
  102 + public static ServletListenerRegistrationBean<HttpSessionEventPublisher> httpSessionEventPublisher() {
  103 + return new ServletListenerRegistrationBean<HttpSessionEventPublisher>(
  104 + new HttpSessionEventPublisher());
  105 + }
  106 +
  107 + @Bean
  108 + public HttpFirewall httpFirewall() {
  109 + return new DefaultHttpFirewall();
  110 + }
  111 +}
src/main/java/com/bsth/security/filter/LoginInterceptor.java
1 -package com.bsth.security.filter;  
2 -  
3 -import com.alibaba.fastjson.JSON;  
4 -import com.bsth.common.Constants;  
5 -import com.bsth.common.ResponseCode;  
6 -import com.bsth.util.RequestUtils;  
7 -import org.springframework.security.core.Authentication;  
8 -import org.springframework.security.core.context.SecurityContextHolder;  
9 -import org.springframework.util.AntPathMatcher;  
10 -import org.springframework.util.PathMatcher;  
11 -  
12 -import javax.servlet.*;  
13 -import javax.servlet.http.HttpServletRequest;  
14 -import javax.servlet.http.HttpServletResponse;  
15 -import java.io.IOException;  
16 -import java.util.HashMap;  
17 -import java.util.Map;  
18 -  
19 -/**  
20 - *  
21 - * @ClassName: LoginInterceptor  
22 - * @Description: TODO(登录校验)  
23 - * @author PanZhao  
24 - * @date 2016年3月24日 上午11:49:20  
25 - *  
26 - */  
27 -public class LoginInterceptor implements Filter {  
28 -  
29 - private final PathMatcher pathMatcher = new AntPathMatcher();  
30 -  
31 - /**  
32 - * 白名单  
33 - * 相比于 BaseFilter,此处对线调GPS请求进行了拦截验证  
34 - */  
35 - private String[] whiteListURLs = { Constants.LOGIN_PAGE,Constants.CAPTCHA, Constants.ORIGINAL_LOGIN_PAGE, Constants.SERVICE_INTERFACE,  
36 - Constants.ASSETS_URL, Constants.FAVICON_URL, Constants.LOGIN,  
37 - Constants.LOGIN_FAILURE, Constants.UPSTREAM_URL, Constants.XD_CHILD_PAGES, Constants.UP_RFID_URL,  
38 - Constants.STATION_AND_SECTION_COUNT, Constants.VEHICLE_DATA_SYNC_URL, Constants.FILE_AUTH };  
39 -  
40 -  
41 - @Override  
42 - public void destroy() {  
43 -  
44 - }  
45 -  
46 -  
47 - @Override  
48 - public void init(FilterConfig filterConfig) throws ServletException {  
49 -  
50 - }  
51 -  
52 - @Override  
53 - public void doFilter(ServletRequest request, ServletResponse response,  
54 - FilterChain chain) throws IOException, ServletException {  
55 -  
56 - HttpServletRequest httpRequest = (HttpServletRequest) request;  
57 - HttpServletResponse httpResponse = (HttpServletResponse) response;  
58 -  
59 - String currentURL = httpRequest.getServletPath();  
60 -  
61 - if (!isWhiteURL(currentURL) && request.getParameter("token") == null) {  
62 - Authentication authentication = SecurityContextHolder.getContext().getAuthentication();  
63 -  
64 - if(null == authentication){  
65 - //没有登录  
66 -  
67 - if(RequestUtils.isAjaxRequest(httpRequest)){  
68 - Map<String, Object> map = new HashMap<>();  
69 - map.put("status",  
70 - ResponseCode.NO_AUTHENTICATION);  
71 - response.getWriter().print(JSON.toJSONString(map));  
72 - }  
73 - else  
74 - httpResponse.sendRedirect(Constants.LOGIN_PAGE);  
75 -  
76 - return;  
77 - }  
78 - }  
79 -  
80 - chain.doFilter(request, response);  
81 - }  
82 -  
83 - private boolean isWhiteURL(String currentURL) {  
84 - for (String whiteURL : whiteListURLs) {  
85 - if (pathMatcher.match(whiteURL, currentURL)) {  
86 - return true;  
87 - }  
88 - }  
89 - return false;  
90 - }  
91 -  
92 -} 1 +package com.bsth.security.filter;
  2 +
  3 +import com.alibaba.fastjson.JSON;
  4 +import com.bsth.common.Constants;
  5 +import com.bsth.common.ResponseCode;
  6 +import com.bsth.util.RequestUtils;
  7 +import org.springframework.security.core.Authentication;
  8 +import org.springframework.security.core.context.SecurityContextHolder;
  9 +import org.springframework.util.AntPathMatcher;
  10 +import org.springframework.util.PathMatcher;
  11 +
  12 +import javax.servlet.*;
  13 +import javax.servlet.http.HttpServletRequest;
  14 +import javax.servlet.http.HttpServletResponse;
  15 +import java.io.IOException;
  16 +import java.util.HashMap;
  17 +import java.util.Map;
  18 +
  19 +/**
  20 + *
  21 + * @ClassName: LoginInterceptor
  22 + * @Description: TODO(登录校验)
  23 + * @author PanZhao
  24 + * @date 2016年3月24日 上午11:49:20
  25 + *
  26 + */
  27 +public class LoginInterceptor implements Filter {
  28 +
  29 + private final PathMatcher pathMatcher = new AntPathMatcher();
  30 +
  31 + /**
  32 + * 白名单
  33 + * 相比于 BaseFilter,此处对线调GPS请求进行了拦截验证
  34 + */
  35 + private String[] whiteListURLs = { Constants.LOGIN_PAGE,Constants.CAPTCHA, Constants.ORIGINAL_LOGIN_PAGE, Constants.SERVICE_INTERFACE,
  36 + Constants.LOGIN_ASSETS_URL, Constants.FAVICON_URL, Constants.LOGIN,
  37 + Constants.LOGIN_FAILURE, Constants.UPSTREAM_URL, Constants.XD_CHILD_PAGES, Constants.UP_RFID_URL,
  38 + Constants.STATION_AND_SECTION_COUNT, Constants.VEHICLE_DATA_SYNC_URL, Constants.FILE_AUTH, "/e10adc3949ba59abbe56e057f20f883e.html", "/8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92.html"};
  39 +
  40 +
  41 + @Override
  42 + public void destroy() {
  43 +
  44 + }
  45 +
  46 +
  47 + @Override
  48 + public void init(FilterConfig filterConfig) throws ServletException {
  49 +
  50 + }
  51 +
  52 + @Override
  53 + public void doFilter(ServletRequest request, ServletResponse response,
  54 + FilterChain chain) throws IOException, ServletException {
  55 +
  56 + HttpServletRequest httpRequest = (HttpServletRequest) request;
  57 + HttpServletResponse httpResponse = (HttpServletResponse) response;
  58 +
  59 + String currentURL = httpRequest.getServletPath();
  60 +
  61 + if (!isWhiteURL(currentURL) && request.getParameter("token") == null) {
  62 + Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
  63 +
  64 + if(null == authentication){
  65 + //没有登录
  66 +
  67 + if(RequestUtils.isAjaxRequest(httpRequest)){
  68 + Map<String, Object> map = new HashMap<>();
  69 + map.put("status",
  70 + ResponseCode.NO_AUTHENTICATION);
  71 + response.getWriter().print(JSON.toJSONString(map));
  72 + }
  73 + else
  74 + httpResponse.sendRedirect(Constants.LOGIN_PAGE);
  75 +
  76 + return;
  77 + }
  78 + }
  79 +
  80 + chain.doFilter(request, response);
  81 + }
  82 +
  83 + private boolean isWhiteURL(String currentURL) {
  84 + for (String whiteURL : whiteListURLs) {
  85 + if (pathMatcher.match(whiteURL, currentURL)) {
  86 + return true;
  87 + }
  88 + }
  89 + return false;
  90 + }
  91 +
  92 +}