@@ -54,42 +54,46 @@ public boolean preHandle(HttpServletRequest request, HttpServletResponse respons
54
54
LOGGE .info ("UserAgent: {}" , request .getHeader (USER_AGENT ));
55
55
LOGGE .info ("用户访问地址: {}, 来路地址: {}" , uri , IPKit .getIpAddrByRequest (request ));
56
56
57
- // 请求拦截处理
57
+ // 获取当前登录用户
58
58
UserDomain user = TaleUtils .getLoginUser (request );
59
- if (null == user ) {
59
+ if (user == null ) {
60
60
Integer uid = TaleUtils .getCookieUid (request );
61
- if (null != uid ) {
62
- // Cookie 可以伪造,因此要注意
61
+ if (uid != null ) {
63
62
user = userService .getUserInfoById (uid );
64
63
request .getSession ().setAttribute (WebConst .LOGIN_SESSION_KEY , user );
65
64
}
66
65
}
67
66
68
- // 需要认证的路径,不包括静态资源和登录页面
67
+ // 权限控制
69
68
if (uri .startsWith ("/admin" )
70
69
&& !uri .startsWith ("/admin/login" )
71
- && null == user
70
+ && user == null
72
71
&& !isStaticResource (uri )) {
73
72
74
73
response .sendRedirect (request .getContextPath () + "/admin/login" );
75
74
return false ;
76
75
}
77
76
78
- // 设置 CSRF token,仅对敏感操作进行 CSRF 校验
77
+ // 检查权限:对于敏感操作路径(如删除),确保用户是管理员
78
+ if (isSensitiveOperation (uri ) && user == null ) {
79
+ response .sendError (HttpServletResponse .SC_FORBIDDEN , "Unauthorized access" );
80
+ return false ;
81
+ }
82
+
83
+ // 设置 CSRF token,仅对敏感操作进行校验
79
84
if ("GET" .equalsIgnoreCase (request .getMethod ())) {
80
85
String csrfToken = UUID .UU64 ();
81
- // 默认存储30分钟
82
86
cache .hset (Types .CSRF_TOKEN .getType (), csrfToken , uri , 30 * 60 );
83
87
request .setAttribute ("_csrf_token" , csrfToken );
84
- } else if ("POST" .equalsIgnoreCase (request .getMethod ()) && isSensitiveOperation (uri )) {
88
+ } else if ("POST" .equalsIgnoreCase (request .getMethod ()) && isSensitiveOperation (uri ) && user == null ) {
85
89
// 检查 POST 请求的 CSRF token
86
90
String csrfToken = request .getParameter ("_csrf_token" );
87
91
String expectedUri = cache .hget (Types .CSRF_TOKEN .getType (), csrfToken );
88
92
if (expectedUri == null || !expectedUri .equals (uri )) {
89
93
response .sendError (HttpServletResponse .SC_FORBIDDEN , "CSRF token invalid or expired." );
90
94
return false ;
91
95
}
92
- cache .hdel (Types .CSRF_TOKEN .getType (), csrfToken ); // Token 仅使用一次
96
+ cache .hdel (Types .CSRF_TOKEN .getType (), csrfToken );
93
97
}
94
98
95
99
return true ;
@@ -113,6 +117,7 @@ private boolean isSensitiveOperation(String uri) {
113
117
114
118
115
119
120
+
116
121
@ Override
117
122
public void postHandle (HttpServletRequest httpServletRequest , HttpServletResponse httpServletResponse , Object o , ModelAndView modelAndView ) throws Exception {
118
123
OptionsDomain ov = optionService .getOptionByName ("site_record" );
0 commit comments