我有一个Android应用程序,我在服务器端使用spring security进行身份验证和授权。第一个用户输入用户名和密码,并通过请求使用Rest Template将其发送到服务器控制器进行身份验证。我有完成了这个用户名密码请求的认证部分。现在我必须为连续的请求认证生成一个令牌。但我不知道该怎么做。这就是我的想法 -
a)生成并存储AES密钥。
b)使用此AES密钥加密用户名+时间戳(您必须在此步骤之后进行base64编码以避免任何特殊字符)。这将是您的用户令牌。
c)使用HMAC密钥签署此令牌(再次将其存储在密钥库中)。
d)将令牌与签名一起发送(使用;作为分隔符)。
e)将您在步骤c中获得的令牌与DB中的用户名存储在一起。
令牌将作为响应的一部分发送给客户端。 我不知道如何实现上述方法。我在网上搜索过但没有找到任何有用的东西。 下面是我用于身份验证的代码。
try{
System.out.println("Request received... ");
Gson gson = new Gson();
TestUser userChk=new TestUser();
userChk=gson.fromJson(coaObj, TestUser.class);
Authentication authenticationToken = new UsernamePasswordAuthenticationToken(userChk.getUserName(), userChk.getPassword());
Authentication authentication = authenticationManager.authenticate(authenticationToken);
SecurityContextHolder.getContext().setAuthentication(authentication);
System.out.println("getAuthorities is "+authentication.getAuthorities()+" getCredentials "+authentication.getCredentials()+" getDetails "+authentication.getDetails()+" getPrincipal "+authentication.getPrincipal());
return "Authenticated";
}catch(Exception er){
System.out.println("Authentication error "+er);
return "Authentication failure";
}
有人请帮我用这种方法生成令牌并管理它。
答案 0 :(得分:0)
最近,我参与了一个项目,在该项目中,我们为Web和移动应用程序公开了REST API。您可以在身份验证成功后发送cookie(以维护会话)。它也适用于移动应用程序。您需要扩展SimpleUrlAuthenticationSuccessHandler并发送cookie作为响应,如果您希望会话持续较长时间,还可以设置cookie年龄。
package com.arjun.security;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.RedirectStrategy;
import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler;
import org.springframework.security.web.savedrequest.HttpSessionRequestCache;
import org.springframework.security.web.savedrequest.RequestCache;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.informage.arnav.dto.response.LoginUserResponseDto;
import com.informage.arnav.service.UserService;
import com.informage.arnav.util.ApplicationUtil;
public class AppSimpleUrlAuthenticationSuccessHandler extends SimpleUrlAuthenticationSuccessHandler {
@Autowired
ApplicationUtil applicationUtil;
@Autowired
UserService userService;
private RequestCache requestCache = new HttpSessionRequestCache();
public AppSimpleUrlAuthenticationSuccessHandler() {
super();
setRedirectStrategy(new NoRedirectStrategy());
}
@Override
public void onAuthenticationSuccess(HttpServletRequest request,
HttpServletResponse response,
Authentication authentication) throws ServletException,
IOException {
super.onAuthenticationSuccess(request, response, authentication);
AppUserDetails appUserDetails = applicationUtil.getCurrentUser();
appUserDetails.setSessionId(request.getSession().getId());
Cookie[] cookies = request.getCookies();
if (cookies.length > 0) {
for (Cookie cookie : cookies) {
if (cookie != null) {
if (cookie.getName().equals("JSESSIONID")) {
String value = cookie.getValue();
cookie.setMaxAge(1555200000);
cookie.setPath("/");
//cookie.setHttpOnly(true);
response.addCookie(cookie);
}
}
}
}
LoginUserResponseDto dto = userService.getDtoFromUserName(appUserDetails.getUsername());
Gson gson = new GsonBuilder().create();
String json = gson.toJson(dto);
response.getWriter().write(json);
response.addHeader("Content-Type", "application/json");
response.getWriter().flush();
}
}
getCurrentUser方法的代码是:
public AppUserDetails getCurrentUser() {
final Object principal = SecurityContextHolder.getContext()
.getAuthentication()
.getPrincipal();
final AppUserDetails appUserDetails;
if (principal != null && principal instanceof AppUserDetails) {
appUserDetails = (AppUserDetails) principal;
} else {
appUserDetails = null;
}
return appUserDetails;
}
最后,您需要在security.xml文件中配置它。
<beans:property name="authenticationSuccessHandler"
ref="mySuccessHandler" />
<beans:bean id="mySuccessHandler"
class="com.informage.arnav.security.AppSimpleUrlAuthenticationSuccessHandler" />