1

我正在考虑通过 spring 3 security 实现用户授权。我知道用户名和密码存储在一些 XML 文件中,如下所示:

<authentication-manager>
  <authentication-provider>
    <user-service>
       <user name="username" password="123456" authorities="ROLE_USER" />
    </user-service>
  </authentication-provider>
</authentication-manager>

但我想知道,如何添加用户或更改密码?有人可以给我看看吗?

4

2 回答 2

2

user-service元素创建一个InMemoryUserDetailsManager具有修改用户和更改密码的方法。

然而,在 XML 中定义用户实际上只是为了测试。如果您希望能够添加和更新用户信息,那么您应该使用数据库。标准 Spring Security 数据库模式记录在参考手册中。

然后,您可以使用JDBCUserDetailsManager实现,也可以构建自己的自定义数据管理代码。

于 2013-03-09T21:56:01.143 回答
1

同意卢克。在 XML 中存储用户名和密码不是一个好的做法。将用户详细信息存储在数据库中,以便您可以添加修改它们。

创建数据库

CREATE TABLE IF NOT EXISTS users (
     username VARCHAR(10) NOT NULL,  
     password VARCHAR(32) NOT NULL,
     enabled BOOLEAN NOT NULL,
     PRIMARY KEY (username)  
);  

CREATE TABLE IF NOT EXISTS authorities (  
     username VARCHAR(10) NOT NULL,  
     authority VARCHAR(10) NOT NULL,  
     FOREIGN KEY (username) REFERENCES users(username)
); 

insert into users(username,password,enabled) values ('abc','123456',TRUE);   
insert into authorities(username,AUTHORITY) values ('abc', 'ROLE_USER');

这里的表名、列名是根据 Spring Security 默认查询使用的('select username, password, enabled from users where username = ?')。因为当我们使用默认名称时,我们不需要显式指定查询来获取用户详细信息。查看Spring Security 文档以获取更多详细信息。

数据源

您需要定义如下的数据源 bean,因为 Spring Security 需要连接数据库以获取用户详细信息,因此您需要告诉它哪个驱动程序、数据库 URL、用户名和密码。例如如下。

<bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="org.hsqldb.jdbc.JDBCDriver" />
    <property name="url" value="jdbc:hsqldb:hsql://localhost/elab" />
    <property name="username" value="sa" />
    <property name="password" value="" />
</bean>

Spring 安全配置

现在我们需要将 spring security 告诉用户数据库以获取登录详细信息。因此,我们使用'jdbc-user-service'代替作为内存 UserDetailsS ​​ervice 的 user-service 。现在我们的身份验证管理器将如下所示。

<authentication-manager>
    <authentication-provider>
        <jdbc-user-service data-source-ref="dataSource"/>
    </authentication-provider>
</authentication-manager>

请注意,如果用户表结构与默认情况下 Spring 期望的不同,则应将查询显式指定为 jdbc-user-service 元素的属性(users-by-username-query)。有关更多信息,请参阅文档。

现在一切就绪,Spring 将愉快地从数据库中获取用户详细信息。

于 2013-03-13T05:46:31.707 回答