2

我正在尝试使用 Spring Security 3.1.3 来保护 Web 应用程序。

目前我已经设置了一个简单的登录表单,它与在 security-app-context.xml 上硬编码的用户一起使用。现在我正试图继续让 spring 验证数据库中的用户,这就是我遇到的问题。
从我目前得到的信息来看,我需要在 applicationContext.xml 上为数据源放置一个 bean,然后在 security-app-context.xml 文件中引用该数据源:

应用contex.xml:

<bean id="dataSource"
  class="org.springframework.jdbc.datasource.DriverManagerDataSource">

  <property name="driverClassName" value="com.mysql.jdbc.Driver" />
  <property name="url" value="jdbc:mysql://localhost:3306/webproject" />
  <property name="username" value="root" />
  <property name="password" value="root" />
</bean>

安全应用上下文.xml

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

但是当我这样做时,从数据库对用户进行身份验证不起作用。没有提出任何例外。

数据库上有两个表,用户(用户名,密码,启用)和权限(用户名,角色名)。我错过了什么吗?

4

2 回答 2

1

我没有足够的声誉来发表评论。无论如何我都不打算给出准确的答案。

我有几个猜测:

  • 您确定角色的数据库列名称是角色名称吗?没有权威?如果没有明确提供,也许 Spring 会寻找一些默认名称。此行将定义您希望它运行的确切查询:

    <authentication-manager>
                <authentication-provider>
                            <jdbc-user-service data-source-ref="dataSource" 
                   users-by-username-query="
                      select username,password, enabled 
                      from users where username=?" 
                   authorities-by-username-query="
                      select u.username, ur.authority from users u, user_roles ur 
                      where u.user_id = ur.user_id and u.username=?" 
                     />
                </authentication-provider>
    </authentication-manager>
    
  • 您是否在 web.xml 中添加了安全过滤器?

  • 或者你的表应该有一些默认名称,比如用户

于 2013-01-03T17:58:02.133 回答
1

您的数据库架构是错误的,authorities没有一roleName列,而是一authority列。根据文档,所需的 SQL 语句是:

create table users(
    username varchar_ignorecase(50) not null primary key,
    password varchar_ignorecase(50) not null,
    enabled boolean not null);

create table authorities (
    username varchar_ignorecase(50) not null,
    authority varchar_ignorecase(50) not null,
    constraint fk_authorities_users foreign key(username) references users(username));
    create unique index ix_auth_username on authorities (username,authority);

哦,每当您遇到 Spring Security 问题时,我建议您启用调试日志记录——那里有很多有价值的信息。

于 2013-01-03T21:48:55.133 回答