我在Spring MVC中还很陌生,尝试理解如何在登录页面中实现“记住我”功能时遇到了一些问题。
所以我正在一个使用4.1.7.RELEASE版本的Spring的Spring项目中。该Web应用程序使用Spring Security和LDAP来处理用户登录。
进入这个项目,我有一个名为login.jsp的登录页面,这个页面:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@page session="true"%>
<%
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
response.setDateHeader("Expires", -1);
%>
<!DOCTYPE html>
<html>
<head>
<!-- link href="<c:url value="resources/css/style.css" />" rel="stylesheet"-->
<link href="<c:url value="resources/css/bootstrap.css" />"
rel="stylesheet">
<link href="<c:url value="resources/css/bootstrap-theme.css" />"
rel="stylesheet">
<link href="<c:url value="resources/css/login.css" />" rel="stylesheet">
<title>Login Page</title>
</head>
<body onload='document.loginForm.username.focus();'>
<!-- div id="intestazione">
<h1 align="center">WIFI e PNSD</h1>
</div-->
<div class="container">
<section id="sezioneBenvenuto">
<h1 id="benvenuto" >Benvenuto</h1>
</section>
<section id="sezioneLogo" >
<img src="resources/img/logo2.png" id="logo">
</section>
<section id="sezioneLogin">
<div id="login-box">
<c:if test="${not empty error}">
<div class="error">${error}</div>
</c:if>
<form class="form-horizontal" name='loginForm' action="<c:url value='/j_spring_security_check' />" method='POST'>
<div class="form-group" style="margin: 0px;" >
<label class="sr-only" for="exampleInputEmail3">Email address</label>
<input type='text' name='username' class="form-control" id="exampleInputEmail3" placeholder="Nome Utente">
<br>
</div>
<div class="form-group" style="margin: 0px;" >
<label class="sr-only" for="exampleInputPassword3">Password</label>
<input type='password' name='password' class="form-control" id="exampleInputPassword3" placeholder="Password">
<br>
</div>
<!-- <button type="submit" class="btn btn-default">Sign in</button> -->
<input id="ricorda" name="submit" type="submit" class="btn btn-default" value="Accedi" style="color: #0F8BB0;" />
<br>
<div style="white-space: nowrap; padding-top: 35px;">
<a id="linkGestioneUtenza" class="pull-left" href="${linkGestioneUtenza}">Gestione utenza</a>
<div class="pull-right">
<input style="vertical-align: top;" type="checkbox">
<label style="vertical-align: top; font-weight: normal; color: #0F8BB0;">Ricordami</label>
</div>
</div>
</form>
</div>
</section>
</div>
<!--jsp:include page="footer.jsp" /-->
<script type="text/javascript" src="webjars/bootstrap/3.2.0/js/bootstrap.min.js"></script>
<script type="text/javascript" src="webjars/jquery/2.1.1/jquery.min.js"></script>
</body>
</html>
因此,正如您在前面的代码片段中所看到的,此复选框代表“记住我”的选择:
<div class="pull-right">
<input style="vertical-align: top;" type="checkbox">
<label style="vertical-align: top; font-weight: normal; color: #0F8BB0;">Ricordami</label>
</div>
好的,使用上一个login.jsp页面,我可以使用我的凭据访问我的应用程序没有问题,但是,如果我选中“记住我”复选框,它将无法正常工作(实际上,当我再次访问该应用程序时,我必须再次插入我的证书)。
因此,我阅读了官方文档,发现必须通过向浏览器发送cookie来实现或配置此行为,该cookie在以后的会话中会被检测到并导致自动登录,如此处所述:http:// docs.spring.io/spring-security/site/docs/4.1.x-SNAPSHOT/reference/html/remember-me.html
据我了解,有两种方法可以做到这一点:
第一个使用散列来保留基于cookie的令牌的安全性。
第二种使用数据库或其他持久性存储机制来存储生成的令牌
这里是第一个疑问:这些断言究竟意味着什么?这两种方法有什么区别?
在文档中,我还可以阅读:
请注意,这两个实现都需要UserDetailsService。如果您使用的身份验证提供程序不使用UserDetailsService(例如LDAP提供程序),那么它将不起作用,除非您在应用程序上下文中还具有UserDetailsService Bean 。
好的,在此项目中,使用LDAP进行用户身份验证。在阅读文档时,在我看来UserDetailsService是一个加载用户特定数据的接口(是否必须由自定义具体类实现?)。
因此,现在我的疑问是:该UserDetailsService到底有什么作用?我在哪里声明它可以将其放入我的应用程序上下文中?进入Spring Security配置文件(spring-security.xml)还是进入Spring配置文件(root-context.xml)?
这些断言究竟意味着什么?
基本上记得我功能可以做两件事
这两种方法有什么区别?
TokenBasedRememberMeServices -
PersistentTokenBasedRememberMeServices
用例示例
public class LdapUserDetailsService implements UserDetailsService {
@Override
public UserDetails loadUserByUsername(final String userName) throws UsernameNotFoundException {
//Basically you need user details , username,password,roles you can fetch from your LdapService
final List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
final SimpleGrantedAuthority authority = new SimpleGrantedAuthority("ROLE_USER");
authorities.add(authority);
return new User(userName, "password", authorities); }
Spring Security配置文件(spring-security.xml)
<!-- Remember me config -->
<security:http
<security:remember-me services-ref="rememberMeServices" />
</security:http>
<bean id="customUserDetailsService" class="com..LdapUserDetailsService"/>
<bean id="rememberMeServices" class="org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices">
<constructor-arg index="0" value="myAppKey" />
<constructor-arg index="1" ref="customUserDetailsService" />
</bean>
<bean id="rememberMeAuthenticationProvider" class="org.springframework.security.authentication.RememberMeAuthenticationProvider">
<constructor-arg index="0" value="myAppKey" />
</bean>
<security:authentication-manager alias="authenticationManager">
<security:authentication-provider ref="rememberMeAuthenticationProvider"/>
</security:authentication-manager>
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句