我正在设计一个 RESTful Web 服务,用户需要在正确的身份验证后才能访问该服务。我已经使用 Spring Security 3.0 为我的应用程序开发了安全性。现在我想集成TokenBasedAuthentication。但我坚持在这里不知道如何做到这一点。
我的ApplicationContextSecurity.xml:
<global-method-security pre-post-annotations="enabled">
</global-method-security>
<beans:bean id="myAccessDecisionManager"
class="com.app.security.MyAccessDecisionManager">
</beans:bean>
<http auto-config="true" once-per-request="true"
access-decision-manager-ref="myAccessDecisionManager"
access-denied-page="/jsp/errorPage.jsp">
<intercept-url pattern="/*.app" access="ROLE_ANONYMOUS" />
<form-login login-page="/login.app"
login-processing-url="/j_spring_security_check" default-target-url="/login/checking.app"
authentication-failure-url="/login.app?login_error=1" />
<logout logout-url="/j_spring_security_logout"
logout-success-url="/login.app" invalidate-session="true" />
<session-management invalid-session-url="/login.app"
session-fixation-protection="newSession">
<concurrency-control max-sessions="100"
error-if-maximum-exceeded="false" />
</session-management>
</http>
<authentication-manager alias="authenticationManager">
<authentication-provider ref="customAuthenticationProvider"></authentication-provider>
</authentication-manager>
<beans:bean id="customAuthenticationProvider"
class="com.app.security.CustomAuthenticationProvider">
</beans:bean>
我的 CustomAuthenticationProvider :
public class CustomAuthenticationProvider implements AuthenticationProvider {
@Autowired
private ILoginService loginService;
protected final transient Log log = LogFactory.getLog(getClass());
public Authentication authenticate(Authentication authentication)
throws AuthenticationException {
UsernamePasswordAuthenticationToken usernamePassswordAuthenticationToken = new UsernamePasswordAuthenticationToken(
authentication.getPrincipal(), authentication.getCredentials());
// Doing authentication process here and returning authentication token
return usernamePassswordAuthenticationToken;
}
public boolean supports(Class<? extends Object> authentication) {
return authentication.equals(UsernamePasswordAuthenticationToken.class);
}
}
我的要求是,
- 当用户第一次想要访问 REST Web 服务时,他应该从 header 中向服务器提供用户名/密码。
- 服务器将接受请求,检查身份验证并为特定时间段内的未来请求生成令牌。
我还需要客户端代码来了解如何访问安全的 Web 服务。
谢谢。
当用户第一次想要访问 REST Web 服务时,他应该
从标头向服务器提供用户名/密码。
服务器将接受请求,检查身份验证并生成
特定时期内未来请求的令牌
您可以使用 HTTP 标头或映射到 Spring MVC 控制器的普通 HTTP POST 请求来执行此操作(这就是我们在应用程序中执行此操作的方式):
@Controller
public class AuthenticationController {
@Autowired
@Qualifier("authenticationManager")
AuthenticationManager authenticationManager;
@Autowired
SecurityContextRepository securityContextRepository;
@RequestMapping(method = RequestMethod.POST, value = "/authenticate")
public @ResponseBody String authenticate(@RequestParam final String username, @RequestParam final String password, final HttpServletRequest request, final HttpServletResponse response) {
final UsernamePasswordAuthenticationToken authenticationRequest = new UsernamePasswordAuthenticationToken(username, password);
final Authentication authenticationResult = this.authenticationManager.authenticate(authenticationRequest);
final String token = <some randomly generated secure token>;
final Authentication authentication = new MyAuthenticationToken(authenticationResult, token);
SecurityContextHolder.getContext().setAuthentication(authentication);
this.securityContextRepository.saveContext(SecurityContextHolder.getContext(), request, response);
return token;
}
}
完成此操作后,客户端应在每个后续请求的 HTTP 标头中发送令牌。
我还需要客户端代码来了解如何访问安全的 Web 服务
不确定您到底在这里寻找什么。如果您的客户端是在 Web 浏览器中运行的 JavaScript 库,则将身份验证令牌设置为每个请求的 HTTP 标头应该很简单。如果您的客户端是设备,则设备可以将令牌存储在内存中,并将其作为 HTTP 标头包含在使用您用来调用服务的任何 HTTP 客户端库的每个请求中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)