- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经使用 Spring Security 3.1 在 Spring MVC 应用程序中实现了“记住我”功能
我的 security-context.xml 如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:security="http://www.springframework.org/schema/security"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.1.xsd">
<import resource="servlet-context.xml" />
<security:global-method-security secured-annotations="enabled" />
<security:http auto-config="true" authentication-manager-ref="am">
<!-- Restrict URLs based on role -->
<security:intercept-url pattern="/public/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />
<security:intercept-url pattern="/resources/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />
<security:intercept-url pattern="/**" access="ROLE_USER" />
<!-- Override default login and logout pages -->
<security:form-login login-page="/public/login"
login-processing-url="/public/loginProcess"
default-target-url="/public/loginSuccess"
authentication-failure-url="/public/login?login_error=1"
always-use-default-target="true" />
<security:logout logout-url="/public/logout" logout-success-url="/public/login?logout=1" />
<security:remember-me services-alias="rmService" data-source-ref="dataSource"/>
<security:custom-filter position="LAST" ref="httpResponseAuthFilter" />
</security:http>
<security:authentication-manager id="am">
<security:authentication-provider >
<security:password-encoder ref="passwordEncoder" />
<security:jdbc-user-service data-source-ref="dataSource" />
</security:authentication-provider>
</security:authentication-manager>
<bean id="httpResponseAuthFilter"
class="mypackage.HttpResponseAuthenticationFilter" >
<property name="authenticationManager" ref="am"/>
<property name="rememberMeServices" ref="rmService"></property>
</bean>
</beans>
Filter 类的实现如下:
public class HttpResponseAuthenticationFilter extends RememberMeAuthenticationFilter {
@Override
protected void onSuccessfulAuthentication(final HttpServletRequest request, final HttpServletResponse response,
final Authentication authResult) {
super.onSuccessfulAuthentication(request, response, authResult);
if (authResult != null) {
// process post authentication logic here..
}
}
}
使用上述配置,“记住我”功能可以正常工作,但在 Eclipse 调试器中运行时,我发现 HttpResponseAuthenticationFilter.onSuccessfulAuthentication() 不会被调用。
编辑
修改我的 security-context.xml 并使用标准 Spring bean 定义记住我服务并在配置中引用该服务后,看起来
<security:http auto-config="true" authentication-manager-ref="am">
<!-- Restrict URLs based on role -->
<security:intercept-url pattern="/public/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />
<security:intercept-url pattern="/resources/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />
<security:intercept-url pattern="/**" access="ROLE_USER" />
<!-- Override default login and logout pages -->
<security:form-login login-page="/public/login"
login-processing-url="/public/loginProcess"
default-target-url="/public/loginSuccess"
authentication-failure-url="/public/login?login_error=1"
always-use-default-target="true" />
<security:remember-me services-ref="rememberMeService"/>
<security:logout logout-url="/public/logout" logout-success-url="/public/login?logout=1" />
<security:custom-filter position="LAST" ref="httpResponseAuthFilter" />
</security:http>
<security:authentication-manager id="am">
<security:authentication-provider >
<security:password-encoder ref="passwordEncoder" />
<security:jdbc-user-service data-source-ref="dataSource" />
</security:authentication-provider>
<security:authentication-provider ref="rememberMeAuthenticationProvider" />
</security:authentication-manager>
<bean id="rememberMeAuthenticationProvider" class=
"org.springframework.security.authentication.RememberMeAuthenticationProvider">
<property name="key" value="riskAnalysis" />
</bean>
<bean id="httpResponseAuthFilter"
class="mypacakge.HttpResponseAuthenticationFilter" >
<property name="authenticationManager" ref="am"/>
<property name="rememberMeServices" ref="rememberMeService"></property>
</bean>
<bean id="rememberMeService"
class="org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices">
<property name="userDetailsService" ref="userDetailsService" />
<property name="key" value="riskAnalysis" />
</bean>
<bean id="userDetailsService"
class="org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl">
<property name="dataSource" ref="dataSource"/>
</bean>
这是我在日志中得到的内容:
*DEBUG:mypackage.HttpResponseAuthenticationFilter - SecurityContextHolder 未填充记住我 token ,因为它已包含:'org.springframework.security.authentication.RememberMeAuthenticationToken@303f2184:主体:org.springframework.security.core.userdetails.User @cb7ea6f6:用户名:tarun4;密码保护];启用:真;帐户未过期:true;凭证未过期:true;帐户非锁定:true;授予权限:ROLE_ADMIN、ROLE_USER;凭证:[ protected ];已验证:真实;详细信息:org.springframework.security.web.authentication.WebAuthenticationDetails@b364:RemoteIpAddress:0:0:0:0:0:0:0:1; session ID:空;授予权限:ROLE_ADMIN、ROLE_USER'*
所以看起来 session 中存在身份验证信息。
谢谢,塔伦
最佳答案
remember-me
命名空间元素已经插入了 RememberMeAuthenticationFilter
,因此它仍然优先于您的元素,因为它在过滤器链中位于它之前。
如果您想使用自定义过滤器,您应该删除命名空间元素并使用标准 Spring bean 进行相关服务。有一个例子in the reference manual (Section 11.4.1)其中显示了所需的 bean 。
关于java - Spring Security 自定义 RememberMeAuthenticationFilter 没有被解雇,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22663488/
我的代码需要范围守卫,但是我是否必须手动 Dismiss() 从函数正常退出时所有范围守卫?即 void Deleter(MyClass* obj) { delete obj; } MyCla
当 UIPopoverController 被 UIPopoverController 本身的矩形之外的任何地方触摸解除时,是否有一个方法被调用? 状态: firstView 有一个 navBar。它
为调用实现 twilio,我尝试使用广播接收器而不是 twilio 逻辑的 Activity 。我的广播接收器应该通过 onReceive() 捕捉到 Intent ,但实际上并没有。听到了呼唤!但无
在我的应用程序中,我希望在多个 View 中显示 alertview。所以我所做的只是在实用程序类中编写了一个 alertview 并在任何地方使用它。这工作正常。 我什至尝试设置 但徒劳无功。 实用
我想使用具有以下行为/功能的 PopupWindow: 它是可聚焦的(在内部有交互式控件,例如按钮) 弹出窗口“下”的 View 必须正确使用弹出窗口外的触摸 .. 但弹出窗口必须保留在屏幕上,即使在
我正在为 tvOS 开发应用程序,但在取消 UIAlertController 时遇到问题。我在普通 UIViewController 之上呈现一个 UIAlertController。当我按下电视
我有一个 Controller A,还有一个 UIButton,单击它我将呈现一个新的 Controller B。但问题是 Controller B 首先嵌入了 NAV。所以最终我将介绍 UINavi
当我单击从 Web 服务打开所单击项目的数据的列表项时,我想打开一个 ProgressDialog。ProgressDialog 需要出现,直到被点击项目的 WebContent 被打开。 我知道使用
任何人都可以帮助我防止 alertview 在其按钮单击事件中被解雇吗?? 我有一个 textview 作为我的 alertView 的 subview ,如果 textview 的值为 nil,我不
这是按钮操作: @IBAction func readyPressed(sender: NSButton) { self.dismissController(Hardness)
我正在尝试防止当用户点击弹出窗口外部时弹出窗口被关闭。我似乎对此有其他问题/答案,他们似乎都建议使用 modalInPopover 作为 View 。正如我所看到的那样,我已经在 viewDidApp
我正在将 SFSafariViewController 推送到 UITabBarController 中。但单击 Safari 完成按钮会关闭 UITabBarController。如何预防? 最佳答
我有 2 个 viewcontroller,第一个 VC 包含 backButton。 firstVC.h @protocol DVDelegate -(void)DVViewControllerD
这是我的设置: 导航 Controller :ViewcontrollerA -> ViewControllerB ViewcontrollerB 显示一个 imagePickerController
我使用 ProgressDialog 向用户显示他必须等待,并在用户必须等待时使我的应用程序表面“不可触摸”。我向 progressDialog 添加了一个按钮,如果某些条件为真,它应该开始一些操作。
我目前正在尝试实现移动和导出模式的功能。我所做的就是让用户导航到他们想要将文件移动/导出到的目录,然后在他们选择的目录上调用 dismissGrantingAccessToURL,并附加原始文件的文件
我是一名优秀的程序员,十分优秀!