如何为自定义SQL模式用户角色配置具有安全性的spring-boot?

时间:2017-08-20 17:56:36

标签: java spring spring-mvc spring-boot spring-security

我尝试配置spring-boot-security以与我的SQL架构集成:

CREATE TABLE IF NOT EXISTS users (
  id       SERIAL PRIMARY KEY,
  username VARCHAR(20) UNIQUE NOT NULL,
  password VARCHAR(20) UNIQUE NOT NULL,
  role     INTEGER            NOT NULL,
  FOREIGN KEY (role) REFERENCES user_role (id)
);

CREATE TABLE IF NOT EXISTS user_role (
  id   SERIAL PRIMARY KEY,
  role VARCHAR(10)
);

我找到了许多带有spring-boot-security的集成数据库的例子以及所有这些例子:

@Autowired
public void configAuthentication(AuthenticationManagerBuilder auth) throws Exception {
    auth.jdbcAuthentication().dataSource(dataSource)
            .usersByUsernameQuery(
                    "select username,password, enabled from users where username=?")
            .authoritiesByUsernameQuery(
                    "select username, role from user_roles where username=?");
}

我不了解如何使用方法usersByUsernameQueryauthoritiesByUsernameQuery。为何所有人都选择usernamepassword的位置?密码不需要身份验证?

请向我解释这项工作如何。 如何使用configAuthentication()将我的数据库连接到安全性?

1 个答案:

答案 0 :(得分:4)

根据您的方法,您必须进行一些更改才能成功运行usersByUsernameQueryauthoritiesByUsernameQuery中的查询。

例如:usersByUsernameQuery根据您的表格定义应为select username,password,true from users where username=?,因为您的用户表上没有启用启用。

authoritiesByUsernameQuery应该是select u.username, r.role from users u inner join user_roles r on (r.id=u.role) where u.username=?,因为一个表包含用户信息,另一个表是您应该在查询中使用联接的角色。

Spring认证允许您配置许多方法来实现您的认证方法,在这种情况下,您提出的问题是jdbc认证方法。

当您使用jdbc身份验证时,需要检查以下内容:

  1. 确保pom.xml具有jdbc依赖关系和数据库依赖关系,此示例适用于h2数据库

      <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-jdbc</artifactId>
            </dependency>
      <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
        </dependency>
    
  2. 定义数据源bean,让spring boot知道如何连接数据库

  3. DataSource Bean

    @Bean(name = "dataSource")
     public DriverManagerDataSource dataSource() {
         DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource();
         driverManagerDataSource.setDriverClassName("org.h2.Driver");
         driverManagerDataSource.setUrl("jdbc:h2:~/test2");
         return driverManagerDataSource;
    
     }
    
    1. 然后你需要创建一个扩展WebSecurityConfigurerAdapter的类,以便将DataSource bean注入你的AuthenticationManager构建器,这里是Spring Authentication与你的数据库绑定以便执行的地方查询以检索您已在数据库上创建的用户和角色数据。
    2. 例如:

      public class MySecurityConfiguration extends WebSecurityConfigurerAdapter {
      
       @Autowired
       DataSource dataSource;
      
       @Autowired
       public void configAuthentication(AuthenticationManagerBuilder auth) throws Exception {
      

      最后auth.jdbcAuthentication().dataSource(dataSource)设置数据源以查询用户和角色。

      / login servlet身份验证的前端连接

      首先创建将使用/login servlet

      的视图
        <!DOCTYPE html>
          <html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
                xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
          <head>
              <title>Spring Security Example </title>
          </head>
          <body>
          <div th:if="${param.error}">
              Invalid username and password.
          </div>
          <div th:if="${param.logout}">
              You have been logged out.
          </div>
          <form th:action="@{/login}" method="post">
              <div><label> User Name : <input type="text" name="username"/> </label></div>
              <div><label> Password: <input type="password" name="password"/> </label></div>
              <div><input type="submit" value="Sign In"/></div>
          </form>
          </body>
          </html>
      

      注册登录视图

      @Configuration
          public class MvcConfig extends WebMvcConfigurerAdapter {
              @Override
              public void addViewControllers(ViewControllerRegistry registry) {
                  registry.addViewController("/login").setViewName("login");
              }
          }
      

      希望有所帮助。