使用Ajax登录Spring安全性
我正在尝试使用Spring Security处理基于Ajax的登录系统并且它工作正常,直到我得到另一个需要配置authentication-success-handler的要求,因此我可以在用户通过Spring验证后进行一些后期处理安全.
早些时候我没有使用< form-login />用于显示登录页面.我的登录部分是一个下拉列表,是标题部分的一部分,对于整个应用程序是常见的. 这就是我尝试配置Spring安全性的方法 <http pattern="/customer/**" auto-config="true" use-expressions="true" authentication-manager-ref="customerAuthenticationManager"> <!--<http pattern="/customer/**" auto-config="true" use-expressions="true">--> <intercept-url pattern="/customer/logon.html*" access="permitAll" /> <intercept-url pattern="/customer/denied.html" access="permitAll"/> <intercept-url pattern="/customer" access="hasRole('AUTH_CUSTOMER')" /> <intercept-url pattern="/customer/" access="hasRole('AUTH_CUSTOMER')" /> <intercept-url pattern="/customer/*.html" access="hasRole('AUTH_CUSTOMER')" /> <intercept-url pattern="/customer/*/*.html" access="hasRole('AUTH_CUSTOMER')" /> <form-login login-processing-url="/customer/logon.html" login-page="/shop/home.html" authentication-success-handler-ref="webshopAuthenticationSuccessHandler" /> <logout invalidate-session="true" logout-success-url="/customer/home.html" logout-url="/customer/j_spring_security_logout" /> <access-denied-handler error-page="/customer/denied.html"/> </http> 使用这些配置,当我点击具有正确凭据的登录按钮时,我收到HTTP 302错误 http://localhost:8080/shop/customer/logon.html 302 found 不确定我究竟做错了什么? <form id="login" method="post" accept-charset="UTF-8"> <input id="userName" type="text" name="userName" size="30" /> <button type="submit" class="btn">Login</button> </form> Ajax代码 var data = $(this).serializeObject(); $.ajax({ 'type': 'POST','url': "<c:url value="/customer/logon.html"/>",'contentType': 'application/json','data': JSON.stringify(data),'dataType': 'json',.... }}: 登录部分 Authentication authenticationToken = new UsernamePasswordAuthenticationToken(customer.getUserName(),customer.getPassword()); try { Authentication authentication = customerAuthenticationManager.authenticate(authenticationToken); SecurityContextHolder.getContext().setAuthentication(authentication); resp.setStatus(AjaxResponse.RESPONSE_STATUS_SUCCESS); } catch (AuthenticationException ex) { resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE); } 有什么输入?经过我所有的努力,我仍然得到302并且具有上述配置,甚至我的logon.html控制器也没有被调用. 我的主要问题是当我使用Spring安全性时 <form-login login-processing-url="/customer/logon.html" login-page="/shop/home.html" authentication-success-handler-ref="webshopAuthenticationSuccessHandler" /> 我从logon.html获得302,甚至没有触发logon.html Controller(放置调试器)
首先,您不需要控制器,弹簧安全处理所有这些.所以放下控制器.
当前的问题是由于您的基于JSON的帖子.这是由处理登录的普通过滤器处理的,但它没有看到j_username和j_password字段,因此将重定向(302)到登录页面(在您的情况下为/shop/home.html),要求这些字段. 基本上你将数据发布为JSON,而它应该只是一个ajaxified形式的帖子.这允许您编写一个简单的AuthenticationSuccessHandler,它只需返回401或200状态代码(也可能是正文). 将你的ajax提交改为这样的东西会让事情变得有效. var data = $(this).serializeObject(); $.ajax({ 'type': $(this).action,'url': $(this).target,'data': data }): 这应该创建一个ajax表单帖子.您可能需要在周围方法中调用preventDefault()来停止实际发布的表单. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |