java - 如何在加密之前使用 spring security 登录时获取普通用户凭据?

标签 java spring spring-security

我正在开发具有高度隐私的网络应用程序。我想将每个用户的用户名和加密密码存储在数据库表中,并且我想将 AnonymousUserName 存储在另一个表中以关联个人详细信息。 AnonymousUserName 应该通过对真实用户名进行哈希处理并用明文密码对哈希进行加盐来创建。所以管理员不可能找到 AnonymousUserName,因为密码只是加密存储在数据库中。

尽管如此,我必须知道哪个 AnonymousUserName 属于登录用户。因此,我想在每次用户登录时对用户名进行哈希处理,并用普通密码对哈希进行加盐,并将生成的 AnonymousUserName 保存为 SessionAtribute,当用户离开应用程序时,它会再次被删除。

目前我的 Authentication-Manager 配置看起来非常简单。

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
    xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:repository="http://www.springframework.org/schema/data/repository"
    xsi:schemaLocation="http://www.springframework.org/schema/data/repository http://www.springframework.org/schema/data/repository/spring-repository-1.5.xsd
        http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">


    <http use-expressions="true" auto-config="true">
        <intercept-url pattern="/login"
            access="permitAll"/>
        <access-denied-handler />
        <form-login login-page="/login" default-target-url="/"/>
        <logout />
    </http>
    <beans:bean id="encoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>
    <authentication-manager>
        <authentication-provider user-service-ref="jdbcUserService">
            <password-encoder ref="encoder"/>
        </authentication-provider>
    </authentication-manager>

    <beans:bean id="jdbcUserService"
        class="de.tuberlin.livefeedback.dao.SpringSecurityDaoImpl">
        <beans:property name="dataSource" ref="dataSource" />
        <beans:property name="enableGroups" value="true" />
        <beans:property name="enableAuthorities" value="false" />
        <beans:property name="groupAuthoritiesByUsernameQuery">
            <beans:value>SELECT R.idROLE, R.NAME, P.NAME
            FROM ROLE R 
            JOIN USER_ROLE RM on R.idROLE = RM.user_role_role
            JOIN USER U on U.idUSER = RM.user_role_user
            JOIN ROLE_PERMISSION RP ON RP.role_permission_role = R.idROLE
            JOIN PERMISSION P ON P.idPERMISSION = RP.role_permission_permission
            WHERE U.login=?

            </beans:value>
        </beans:property>
        <beans:property name="usersByUsernameQuery">
            <beans:value>select login,password,enabled from USER where login = ?
            </beans:value>
        </beans:property>
        <beans:property name="authoritiesByUsernameQuery">
            <beans:value>SELECT U.login, P.name FROM USER U, PERMISSION P WHERE U.login = ? AND P.idPERMISSION IN
                (SELECT role_permission_permission FROM ROLE_PERMISSION WHERE role_permission_role IN
                (SELECT user_role_role FROM USER_ROLE WHERE user_role_user=
                (SELECT idUSER FROM USER WHERE login = ? LIMIT 1)))
            </beans:value>
        </beans:property>
    </beans:bean>
</beans:beans>

我的想法是在用户使用他的凭据登录时覆盖处理 httpRequest 的方法,如下面的伪代码应该说明:

@Override
void authenticate (String username, String password){
     String anonymousUserName = hash(username, password);
     httpSession.setAttribute("anonymousUserName", anonymousUserName);
     super(username, password) //to do the authentication-stuff
}

因为我不知道是否有任何方法可以通过这种方式覆盖以及在哪里可以找到,所以我正在写这个问题。

那么,有没有可能以类似的方式做我想做的事情?

谢谢你的期待

最佳答案

你可以使用 AuthenticationSuccessHandler并在其 onAuthenticationSuccess(request, response, authentication) 中实现您的逻辑方法,您可以在其中获取所有必要的信息/对象。

在实践中,这意味着子类化 SavedRequestAwareAuthenticationSuccessHandler它由默认配置使用,并且您很可能希望保留其实现的行为。然后在配置中,您可以将该类与 <form-login authentication-success-handler-ref="..."> 连接起来。属性。

关于java - 如何在加密之前使用 spring security 登录时获取普通用户凭据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17026931/

相关文章:

java - 无法解析 Apache Camel Route 中的 .process

java - 如何更改java中第3方库的日志级别

java - 失去 spring security 记住我重定向后的子域 cookie

java - Thymeleaf - 检查数组是否包含具有属性的元素

java - Spring Security 中的 Spring Expression Language (SpEL) 比较对象使用 equals() 或 ==?

Spring HTTP Invoker session (状态)存储

grails - Spring Security Grails登录时会获取用户详细信息

java - 读取统一码

java - MongoDB 中的查询场景

java - 登录 Activity 已泄漏窗口