Grails4.0.12+SpringSecurity4.0.3:DataTables服务端请求中springSecurityService.principal为空
解决Spring Security在DataTables Ajax请求中无法获取当前用户的问题
检查Ajax请求的认证凭证携带配置
DataTables默认发起的Ajax请求可能不会自动携带认证Cookie(如JSESSIONID),导致Spring Security无法识别已登录用户。需要在DataTables初始化时开启凭证携带:$('#targetTable').DataTable({ ajax: { url: '/your-api-path', type: 'POST', xhrFields: { withCredentials: true } }, // 其他表格配置项 });处理CSRF令牌验证
若Spring Security启用了CSRF保护(默认开启),Ajax请求必须携带CSRF令牌。先在页面中注入令牌信息:<meta name="_csrf" content="${_csrf.token}"/> <meta name="_csrf_header" content="${_csrf.headerName}"/>再在DataTables的Ajax请求中添加请求头:
var csrfToken = $('meta[name="_csrf"]').attr('content'); var csrfHeader = $('meta[name="_csrf_header"]').attr('content'); $('#targetTable').DataTable({ ajax: { url: '/your-api-path', type: 'POST', beforeSend: function(xhr) { xhr.setRequestHeader(csrfHeader, csrfToken); }, xhrFields: { withCredentials: true } }, // 其他表格配置项 });验证控制器的权限配置
确保目标控制器方法没有被设置为匿名访问,添加权限注解强制认证校验:@Controller public class DataController { @Autowired private SpringSecurityService springSecurityService; @PostMapping("/your-api-path") @PreAuthorize("isAuthenticated()") @ResponseBody public Object handleDataRequest() { User currentUser = springSecurityService.getCurrentUser(); // 业务逻辑处理 return resultData; } }检查会话管理策略
若使用Session认证,确认Spring Security未配置sessionCreationPolicy: STATELESS,否则不会创建会话,导致无法获取用户信息。如果是JWT等Token认证,需确保Ajax请求在请求头中携带Token,并配置对应的Spring Security过滤器解析令牌。
内容的提问来源于stack exchange,提问作者Jim Gough
相关产品推荐
相关产品推荐

