Chúng tôi đang phát triển một ứng dụng di động với jQuery dành cho thiết bị di động và muốn xác thực người dùng bằng chương trình phụ trợ mùa xuân 3.1.x được thiết lập chính xác với bảo mật mùa xuân.Bảo mật mùa xuân: lập trình đăng nhập
Yêu cầu POST được gửi đến phần phụ trợ (sử dụng $ .post của jQuery) chứa tên người dùng và mật khẩu, sau đó máy chủ xác minh xem thông tin đăng nhập có chính xác không và đăng nhập người dùng.
Máy chủ có vẻ đã đặt đúng xác thực trong SecurityContext, tuy nhiên khi chúng tôi thực hiện yêu cầu thứ hai cho máy chủ ($ .get tới trang yêu cầu đăng nhập), các chi tiết bảo mật dường như không được ghi nhớ và ẩn danh mã thông báo dường như nằm trong ngữ cảnh.
Đây là phương pháp trong điều khiển để xử lý các (kiểm tra mật khẩu lấy ra cho ngắn gọn) đăng nhập:
@RequestMapping(value = "/login", method = RequestMethod.POST, produces = "application/json")
@ResponseBody
public Map<String, String> login(@RequestParam String username, @RequestParam String password, HttpServletRequest request) {
Map<String, String> response = new HashMap<String, String>();
User u = userService.findByAccountName(username);
if (u != null && u.hasRole("inspector")) {
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(username, password);
try {
Authentication auth = authenticationManager.authenticate(token);
SecurityContextHolder.getContext().setAuthentication(auth);
response.put("status", "true");
return response;
} catch (BadCredentialsException ex) {
response.put("status", "false");
response.put("error", "Bad credentials");
return response;
}
} else {
response.put("status", "false");
response.put("error", "Invalid role");
return response;
}
}
Đây là phương pháp khác mà chúng tôi nhận được userdetails ra khỏi bối cảnh:
@RequestMapping(value = "/project", method = RequestMethod.GET)
@ResponseBody
public String getProjects(HttpSession session) {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
User u = userService.findByAccountName(((UserDetails) authentication.getPrincipal()).getUsername());
...
mùa xuân cấu hình bảo mật:
<global-method-security pre-post-annotations="enabled"/>
<http use-expressions="true" auto-config="true">
<form-login login-processing-url="/static/j_spring_security_check" login-page="/"
authentication-failure-url="/?login_error=t"/>
...
<intercept-url pattern="/api/**" access="permitAll"/>
...
<remember-me key="biKey" token-validity-seconds="2419200"/>
<logout logout-url="/logout"/>
</http>
<authentication-manager alias="authenticationManager">
<authentication-provider user-service-ref="udm">
<password-encoder hash="md5"/>
</authentication-provider>
</authentication-manager>
này nên làm việc theo vào tài liệu bảo mật mùa xuân và các tài nguyên trực tuyến khác. Bất kỳ ý tưởng về những gì có thể là sai?
SecurityContextChính sách giữ nguyên mặc định là ThreadLocal. Mỗi yêu cầu được xử lý trong chủ đề mới (thực sự không phải tất cả trong trường hợp của hồ bơi thread, nhưng điều này không quan trọng) và có nó riêng của bản sao của bối cảnh giữ threadlocal. Vì vậy, xác thực của bạn mà ws thiết lập trong phương thức đăng nhập không thể được truy cập trong phương thức getProjects (vì nó nằm trong một luồng khác). Bạn nên lưu thông tin xác thực của bạn ở một số nơi (ví dụ http session) và khôi phục đối tượng xác thực mỗi lần yêu cầu mới đến máy chủ (có thể trong bộ lọc servlet) –
Kiểm tra http://stackoverflow.com/questions/3923296/user-granted -authorities-are-always-role-anonymous – axtavt
Tôi đã triển khai chức năng chính xác này bằng câu trả lời xuất sắc được liên kết bởi axtavt. –