默认管理员用户(Spring 3、Spring Security)

jac*_*ekn 7 spring-security

这是一个 Spring Security 问题。

在我的应用程序中,我有一个 User 实体作为域对象。用户将被注册并使用存储在数据库中的凭据登录。我的 User 域对象包含支持 Spring UserDetails 对象的实现。

挑战在于我需要能够在创建第一个用户之前登录应用程序。换句话说,我需要以“admin”身份登录才能创建“admin”用户。

为了确保我的 Spring 设置正常工作,我目前正在从 SpringSecurityUserDetailsS​​erviceImpl.loadUserByUsername(String userName) 返回硬编码的管理员用户。

public UserDetails loadUserByUsername(String userName) throws UsernameNotFoundException, DataAccessException {

    User user=null;
    try {
        if("admin".equalsIgnoreCase(userName)) {
            user=new User();
            user.setUserName("ADMIN");
            user.setPassword("adsf"); // assume there's a hash of a true password here
            user.setStatus(UserStatus.ACTIVE);
            user.setAccessLevel(UserAccessLevel.ADMINISTRATOR);
        } else {
            //user = userDAO.getUserByUserName(userName);

        }

    } catch(Throwable t) {
        throw new UsernameNotFoundException("Unable to locate User with user name \"" + userName + "\".", t);
    }

    return user;
}
Run Code Online (Sandbox Code Playgroud)

这有效,所以现在,我正在寻找正确的方法来做到这一点。一种方法是在属性文件中定义此默认管理员用户凭据,并在 loadUserByUsername(String userName) 中读取该属性文件以构造 admn 用户对象。但是,我希望有一种方法可以在 Spring Security xml 配置中执行此操作。我试过了,security:user name="admin" password="admin" authorities="ADMINISTRATOR"但是当你有security:authentication-provider user-service-ref="customUserDetailsService"

我的 spring-security.xml

<security:http auto-config="true" use-expressions="true" access-denied-page="/denied">
<security:intercept-url pattern="/login.html" access="permitAll"/>
<security:intercept-url pattern="/style/**" access="permitAll"/>
<security:intercept-url pattern="/user**" access="hasRole('ADMINISTRATOR')"/>
<security:intercept-url pattern="/**" access="hasRole('AUTHOR')"/>

<security:form-login    login-page="/login.html"
                        login-processing-url="/j_spring_security_check" 
                        authentication-failure-url="/login.html?failedAttempt=true"
                        default-target-url="/home.html"/>

<security:logout        invalidate-session="true"
                        logout-success-url="/login"
                        logout-url="/logout"/>
                        </security:http>

<security:authentication-manager>
    <security:authentication-provider user-service-ref="customUserDetailsService">       
        <security:password-encoder ref="passwordEncoder"/>
    </security:authentication-provider>
</security:authentication-manager>

<bean class="org.springframework.security.authentication.encoding.Md5PasswordEncoder" id="passwordEncoder"/>


<bean id="customUserDetailsService" class="com.modelsite.services.impl.SpringSecurityUserDetailsServiceImpl"/>
Run Code Online (Sandbox Code Playgroud)

所以问题是:我如何定义一个能够登录并执行操作的默认管理员用户。请注意,我不想在设置时使用 sql 导入来处理此问题。

Ral*_*lph 4

您可以有多个身份验证提供程序:

  • 像您已经做的那样使用第一个。
  • 添加第二个具有固定名称、密码和角色的管理员。

(两个身份验证提供程序的顺序很重要;仅当在第一个身份验证提供程序中未找到身份验证时才考虑第二个身份验证提供程序。)

<security:authentication-manager>
    <security:authentication-provider user-service-ref="customUserDetailsService">       
        <security:password-encoder ref="passwordEncoder"/>
    </security:authentication-provider>
    <security:authentication-provider>
        <security:user-service>
            <security:user name="admin" password="admin" authorities="ROLE_USER, ROLE_ADMIN" />
        </security:user-service>
   </security:authentication-provider>
</security:authentication-manager>
Run Code Online (Sandbox Code Playgroud)

@另请参阅:我可以使用 Spring Security 拥有多个安全上下文吗?