使用Spring3 实现用户登录以及权限认证

这里我就简单介绍一下,我在实现的时候处理的一些主要的实现。

1.用户登录

[html]  view plain copy
  1.  <form action="loginAction.do" method="post">  
  2.     <div class="header">  
  3.     <h2 class="logo png"></h2>  
  4.     </div>  
  5.     <ul>  
  6.                 <li><label>用户名</label><input name="username" type="text" class="text"/></li>  
  7.                 <li/>  
  8.                 <li><label>密 码</label><input name="password" type="password" class="text" /></li>   
  9.                 <li/>  
  10.                 <li class="submits">  
  11.                     <input class="submit" type="submit" value="登录" />  
  12.                 </li>  
  13.     </ul>  
  14.     <div class="copyright">© 2013 - 2014 |</div>  
  15. </form>  
以上是前台页面,后台的就是一个简单的逻辑实现:

[java]  view plain copy
  1.        @RequestMapping(value="loginAction.do", method=RequestMethod.POST)  
  2. public ModelAndView loginAction(@RequestParam(value="username") String username, @RequestParam(value="password") String password, HttpSession session, HttpServletResponse resp, @RequestParam(value="savetime", required=false) String savetime) {  
  3.     session.removeAttribute(LogConstant.LOGIN_MESSAGE);  
  4.     SystemUserDataBean user = userDao.getSystemUserByUserName(username);  
  5.     ModelAndView view = null;  
  6.     if(user == null) {  
  7.         view = new ModelAndView(new RedirectView("login.html"));  
  8.         session.setAttribute(LogConstant.LOGIN_MESSAGE, "用户名不正确");  
  9.         return view;  
  10.     }  
  11.     boolean isPasswordCorrect = EncryptionUtil.compareSHA(password, user.getPassword());  
  12.     if(isPasswordCorrect){  
  13.         session.setAttribute(LogConstant.CURRENT_USER, username);  
  14.           
  15.     } else{  
  16.         view = new ModelAndView(new RedirectView("login.html"));  
  17.         session.setAttribute(LogConstant.LOGIN_MESSAGE, "密码不正确");  
  18.     }  
  19.           
  20.     return view;  
  21. }  

2.登录信息

这里,在登录页面有一段javascript,来显示密码错误等信息:

[javascript]  view plain copy
  1. <script type="text/javascript">  
  2. var login_username_info = '<%=request.getSession().getAttribute("currentUser") == null ? "" : request.getSession().getAttribute("currentUser")%>';  
  3. var login_message_info = '<%=request.getSession().getAttribute("login_message") == null ? "" : request.getSession().getAttribute("login_message")%>';  
  4. if(login_message_info != null && login_message_info != ''){  
  5.     alert(login_message_info);  
  6. }  
  7.   
  8. </script>  

3.拦截未登录用户的请求

这里,从页面和后台实现了双重拦截:

页面代码如下:

[javascript]  view plain copy
  1. <%  
  2. if(session.getAttribute("currentUser")==null){  
  3. %>  
  4. window.parent.location='login.html';  
  5. <%  
  6. }  
  7. %>  

后台是一个拦截器(servlet-config.xml):

[html]  view plain copy
  1. <!-- 拦截器 -->    
  2.     <mvc:interceptors>    
  3.         <mvc:interceptor>    
  4.             <mvc:mapping path="/*.do" />    
  5.             <bean class="com..log.report.interceptor.AccessStatisticsIntceptor" />    
  6.         </mvc:interceptor>    
  7.     </mvc:interceptors>    

拦截器的实现是

[java]  view plain copy
  1. import org.springframework.web.servlet.HandlerInterceptor;  
  2. import org.springframework.web.servlet.ModelAndView;  
  3.   
  4.   
  5. public class AccessStatisticsIntceptor implements HandlerInterceptor {  
  6. @Override  
  7.     public void afterCompletion(HttpServletRequest arg0,  
  8.             HttpServletResponse arg1, Object arg2, Exception arg3)  
  9.             throws Exception {  
  10.         // TODO Auto-generated method stub  
  11.   
  12.     }  
  13.   
  14.     @Override  
  15.     public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,  
  16.             Object arg2, ModelAndView arg3) throws Exception {  
  17.         // TODO Auto-generated method stub  
  18.   
  19.     }  
  20.   
  21.     @Override  
  22.     public boolean preHandle(HttpServletRequest request, HttpServletResponse response,  
  23.             Object obj) throws Exception {  
  24.               
  25.         String uri = request.getRequestURI().substring(request.getRequestURI().lastIndexOf("/") +1);  
  26.         if(!AuthorityController.isAuthorized(uri, request.getSession())) {  
  27.             //校验失败  
  28.             return false;  
  29. //          throw new CustomException(LogConstant.USER_NOT_LOGIN);  
  30.         }  
  31.             return true;  
  32.  }  
具体如何校验的,会根据用户的权限,就不介绍了

4.返回未登录前访问的页面

首先在页面添加一段脚本,使用jquery去访问后台

[javascript]  view plain copy
  1.        var page = "";  
  2. var loc = decodeURIComponent(window.parent.location);  
  3. var start = loc.indexOf("Log/") + 8;  
  4. var end = loc.indexOf(".html");  
  5. page = loc.substr(start, end-start);  
  6. if(page != null && page != '') {  
  7.     alert(page);  
  8.     $.ajax({  
  9.         type : "get",  
  10.         url : "setPreviousPageAction.do?previousPage=" + page + ".html",  
  11.         success : function(msg){      
  12.   
  13.         }  
  14.     });  
  15. }  
然后,后台有记录这个页面:

[java]  view plain copy
  1. @RequestMapping(value="setPreviousPageAction.do")  
  2. public void setPreviousPageAction(@RequestParam(value="previousPage") String previousPage, HttpSession session){  
  3.     session.setAttribute(LogConstant.PREVIOUS_PAGE, previousPage);  
  4. }  
在登录完成后,返回这个页面即可。

5.保存用户名密码

登录页面提供一个保存下拉框:

[html]  view plain copy
  1. <select class="save_login" id="savetime" name="savetime">  
  2.     <option selected value="0">不保存</option>  
  3.     <option value="1">保存一天</option>  
  4.     <option value="2">保存一月</option>  
  5.     <option value="3">保存一年</option>  
  6. </select>  

后台在登录时会操作,将信息保存在cookie中:

[java]  view plain copy
  1. if(savetime != null) { //保存用户在Cookie  
  2.     int savetime_value = savetime != null ? Integer.valueOf(savetime) : 0;  
  3.     int time = 0;  
  4.     if(savetime_value == 1) { //记住一天  
  5.         time = 60 * 60 * 24;  
  6.     } else if(savetime_value == 2) { //记住一月  
  7.         time = 60 * 60 * 24 * 30;  
  8.     } else if(savetime_value == 2) { //记住一年  
  9.         time = 60 * 60 * 24 * 365;  
  10.     }  
  11.     Cookie cid = new Cookie(LogConstant.LOG_USERNAME, username);  
  12.     cid.setMaxAge(time);  
  13.     Cookie cpwd = new Cookie(LogConstant.LOG_PASSWORD, password);  
  14.     cpwd.setMaxAge(time);  
  15.     resp.addCookie(cid);  
  16.     resp.addCookie(cpwd);  
  17. }   
前台在发现用户未登录时,会取出cookie中的数据去登录:

[java]  view plain copy
  1. if(session.getAttribute("currentUser")==null){  
  2.     Cookie[] cookies = request.getCookies();  
  3.     String username = null;  
  4.     String password = null;  
  5.     for(Cookie cookie : cookies) {  
  6.         if(cookie.getName().equals("log_username")) {  
  7.             username = cookie.getValue();  
  8.         } else if(cookie.getName().equals("log_password")) {  
  9.             password = cookie.getValue();  
  10.         }  
  11.     }  
  12.     if(username != null && password != null) {  
  13.         %>  
  14.         $.ajax({  
  15.             type : "post",  
  16.             url : "loginByCookieAction.do",  
  17.             data:"username=" + "<%=username%>""&password=" + "<%=password%>",  
  18.             success : function(msg){      
  19.                 if(msg.status == 'success')  
  20.                     window.parent.location.reload();  
  21.                 else if(msg.status == 'failed')  
  22.                     gotoLoginPage();  
  23.             }  
  24.         });  
  25.         <%  
  26.     } else {  
  27.         %>  
  28.         gotoLoginPage();  
  29.         <%  
  30.     }  
  31.       
  32.     ...  

以上就列出了我在解决登录相关问题的方法,代码有点长,就没有全部列出。
使用Spring Security和Redis实现用户登录以及权限控制可以考虑以下细节: 1. 用户登录验证Spring Security提供了多种方式进行用户身份验证,可以选择基于表单登录、基于HTTP Basic认证、基于OAuth2等方式。在基于表单登录的方式中,可以通过实现UserDetailsService接口加载用户信息,或者使用自定义的AuthenticationProvider实现身份验证逻辑。在验证成功后,可以生成并返回JWT token作为用户的凭证。 2. JWT token管理:使用Redis进行JWT token的管理可以考虑将token作为key,用户信息作为value存储在Redis中。在token失效之前,可以通过Redis中的key检查token是否有效,或者通过设置token的过期时间来管理token的有效期。 3. 权限控制:Spring Security提供了基于角色的权限控制和基于资源的权限控制两种方式。可以通过自定义AccessDecisionManager实现权限决策逻辑,或者通过使用注解@EnableGlobalMethodSecurity实现方法级别的权限控制。 4. CSRF保护:Spring Security提供了基于Cookie和基于Header的CSRF保护方式。可以通过在前端页面中添加隐藏的_csrf字段和在后端配置CsrfTokenRepository实现CSRF保护。 5. 安全配置:可以通过配置WebSecurityConfigurerAdapter和HttpSecurity实现登录、注销、记住我等安全相关的行为进行定制。 以上是使用Spring Security和Redis实现用户登录以及权限控制的一些细节,需要根据具体的需求进行定制化实现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值