有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何设置JdbcUserDetailsManager以使用我的表?

我正在学习使用JdbcUserDetailsManager的Spring安全性,我知道MySQL表的默认名称是users。问题是我的MySQL表名是user,而不是users,我不知道如何设置JdbcUserDetailsManager来处理这个表

那么我如何设置这个bean呢

@Bean
public UserDetailsService userDetailsService() {
    JdbcUserDetailsManager service = new JdbcUserDetailsManager(primaryDataSource());
    return service;
}

这是我的MySQL模式:

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(50) NOT NULL,
  `password` char(80) NOT NULL,
  `first_name` varchar(50) NOT NULL,
  `last_name` varchar(50) NOT NULL,
  `email` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=latin1;

CREATE TABLE `role` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;

CREATE TABLE `users_roles` (
  `user_id` int(11) NOT NULL,
  `role_id` int(11) NOT NULL,
  PRIMARY KEY (`user_id`,`role_id`),
  KEY `FK_ROLE_idx` (`role_id`),
  CONSTRAINT `FK_ROLE` FOREIGN KEY (`role_id`) REFERENCES `role` (`id`),
  CONSTRAINT `FK_USER_05` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

任何反馈都将受到重视。多谢各位


共 (1) 个答案

  1. # 1 楼答案

    JdbcUserDetailsManager仅当角色具有分组概念时才有用(假设一个角色可以有多个权限,而一个用户可以有多个角色。我们通过检查用户是否具有某些权限来检查是否允许用户执行某些操作)

    但是基于您的DB模式,角色不支持这种分组概念。相反,您应该使用更简单的JdbcDaoImpl。您必须根据DB架构重写以下SQL:

    @Bean
        public UserDetailsService userDetailsService() {
            UserDetailsService service = new JdbcDaoImpl(primaryDataSource());
            service.setUsersByUsernameQuery("select username, password , true from user where username = ? ");
            service.setAuthoritiesByUsernameQuery("select user.username , role.name " 
                + " from users_role "
                + " inner join role on role.id = users_role.role_id "
                + " inner join user on user.id = users_role.user_id " 
                + " where user.username = ?");
    
            return service;
        }
    

    有关如何重写这些SQL的详细信息,请参阅javadocs