Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >我正在尝试实现spring安全,我配置了所有的东西,但仍然不起作用。

我正在尝试实现spring安全,我配置了所有的东西,但仍然不起作用。
EN

Stack Overflow用户
提问于 2021-11-15 22:59:14
回答 1查看 114关注 0票数 0

spring安全性不使用来自数据库的详细信息进行身份验证和在控制台中生成密码,也不使用我的自定义登录表单。

主类--

代码语言:javascript
运行
AI代码解释
复制
package mis.main;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;

@SpringBootApplication
@ComponentScan({"mis.controller", "mis.services"})
@EntityScan("mis.entity")
@EnableJpaRepositories("mis.dao")
public class BitmisApplication {

    public static void main(String[] args) {
        SpringApplication.run(BitmisApplication.class, args);
    }

}

CustomUserDetails--

代码语言:javascript
运行
AI代码解释
复制
package mis.config;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Set;

import mis.entity.Roles;
import mis.entity.User;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;


public class CustomUserDetails implements UserDetails {
    
    private User user;
    
    public CustomUserDetails(User user) {
        this.user = user;
    }
 
    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        Set<Roles> roles = user.getRoles();
        List<SimpleGrantedAuthority> authorities = new ArrayList<>();
         
        for (Roles role : roles) {
            authorities.add(new SimpleGrantedAuthority(role.getName()));
        }
         
        return authorities;
    }
 
    @Override
    public String getPassword() {
        return user.getPassword();
    }
 
    @Override
    public String getUsername() {
        return user.getUsername();
    }
 
    @Override
    public boolean isAccountNonExpired() {
        return true;
    }
 
    @Override
    public boolean isAccountNonLocked() {
        return true;
    }
 
    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }
 
    @Override
    public boolean isEnabled() {
        return user.isEnabled();
    }
    
}

MyConfig类--

代码语言:javascript
运行
AI代码解释
复制
package mis.config;

import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;



@Configuration
@EnableAutoConfiguration
@EnableWebSecurity
public class MyConfig extends WebSecurityConfigurerAdapter {
    
    
    @Bean
    public UserDetailsService userDetailsService() {
        return new UserDetailsServiceImpl();
    }
     
    @Bean
    public BCryptPasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
     
    @Bean
    public DaoAuthenticationProvider authenticationProvider() {
        DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
        authProvider.setUserDetailsService(userDetailsService());
        authProvider.setPasswordEncoder(passwordEncoder());
         
        return authProvider;
    }
 
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(authenticationProvider());
    }
 
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers("/").hasAnyAuthority("USER", "CREATOR", "EDITOR", "ADMIN")
            .antMatchers("/new").hasAnyAuthority("ADMIN", "CREATOR")
            .antMatchers("/admin/**").hasAnyAuthority("ADMIN", "EDITOR")
            .antMatchers("/delete/**").hasAuthority("ADMIN")
            .anyRequest().authenticated()
            .and()
            .formLogin().permitAll()
            .and()
            .logout().permitAll()
            .and()
            .exceptionHandling().accessDeniedPage("/403")
            ;
    }
}

UserDetailsServiceImpl--

代码语言:javascript
运行
AI代码解释
复制
package mis.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import mis.entity.User;
import mis.dao.UserRepository;

public class UserDetailsServiceImpl implements UserDetailsService {
    
        @Autowired
        private UserRepository userRepository;
         
        @Override
        public UserDetails loadUserByUsername(String username)
                throws UsernameNotFoundException {
            User user = userRepository.getUserByUsername(username);
          
            if (user == null) {
                throw new UsernameNotFoundException("Could not find user");
            }
             
            return new CustomUserDetails(user);
        }

}

UserRepository--

“包装mis.dao;

代码语言:javascript
运行
AI代码解释
复制
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import mis.entity.User;

public interface UserRepository extends JpaRepository<User, Long> {
    @Query("SELECT u FROM User u WHERE u.username = :username")
    public User getUserByUsername(@Param("username") String username);
}"

我认为springboot无法读取这个身份验证文件。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-16 09:49:23

spring应用程序找不到您的信任,因为您的项目结构是错误的,并且您已经添加了错误的自定义配置。

默认情况下,@SpringBootApplication类将扫描它在mis.main中的包以及这个包下面的所有包(mis.main.*等),以便找到所有春季注释类并加载它们。

您已经将您的配置文件放置在mis.config中,该文件不位于mis.main的直接下面,而mis.entity中的文件也不在mis.main下面。

你还增加了

代码语言:javascript
运行
AI代码解释
复制
@ComponentScan({"mis.controller", "mis.services"})
@EntityScan("mis.entity")

为了尝试查找配置文件,但未能将mis.config指定为要扫描的文件夹。

最简单的解决办法是

  • 移除上面提到的两个注释。
  • 将主类移动到包mis中,然后删除包mis.main,以便主类位于项目根。

其他一些事情:

代码语言:javascript
运行
AI代码解释
复制
@Bean
public DaoAuthenticationProvider authenticationProvider() {
    DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
    authProvider.setUserDetailsService(userDetailsService());
    authProvider.setPasswordEncoder(passwordEncoder());
         
    return authProvider;
}
 
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.authenticationProvider(authenticationProvider());
}

不需要,并且可以删除,因为您已经将自定义UserDetailsServicePasswordEncoder声明为bean,它们将由系统自动提取并包含到spring中,并且它将自动为您设置DaoAuthentication。

如果您正在学习,您应该阅读spring安全参考文档--这里提到了所有这些。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69984937

复制
相关文章
MySQL使用存储过程插入批量测试数据
我们先来新建一个表,创建两个普通索引。 CREATE TABLE IF NOT EXISTS  `t` (   `id` int(11) NOT NULL,   `a` int(11) DEFAULT NULL,   `b` int(11) DEFAULT NULL,   PRIMARY KEY (`id`),   KEY `a` (`a`),   KEY `b` (`b`) ) ENGINE=InnoDB;
星哥玩云
2022/08/18
1.9K0
MySQL的存储过程_MySQL创建存储过程
在项目开发中,经常会遇到这样一种场景,当修改A表的一条数据时,需要关联修改B表、C表甚至其他更多表的数据,为什么会这样呢?
全栈程序员站长
2022/11/08
22.6K0
MySQL的存储过程_MySQL创建存储过程
mysql存储过程执行_mysql存储过程不执行
查看event是否开启: show variables like ‘%sche%’;
全栈程序员站长
2022/10/02
16.9K0
mysql使用存储过程demo批量插入数据10w+
先建一个简单的表,表里有 a、b 两个字段,并分别建上索引 CREATE TABLE `t` ( `id` int(11) NOT NULL, `a` int(11) DEFAULT NULL, `b` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `a` (`a`), KEY `b` (`b`) ) ENGINE=InnoDB; 存储过程脚本 delimiter ;; create procedure idata() begin d
高大北
2022/06/14
7800
MySQL:MySQL 存储过程
  <1>存储过程一旦调试完成后,就可以稳定运行,(前提是,业务需求要相对稳定,没有变化)
全栈程序员站长
2022/09/06
16.3K0
MySQL:MySQL 存储过程
MySQL存储过程
存储过程体包含了在过程调用时必须执行的语句,例如:dml、ddl语句,if-then-else和while-do语句、声明变量的declare语句等。
看、未来
2021/12/05
10.3K0
MySQL存储过程
SQL语句需要先编译然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。
流柯
2018/08/30
13.9K0
MySQL存储过程
MySQL 存储过程
  MySQL 5.0 版本开始支持存储过程。存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象。存储过程是为了完成特定功能的 SQL 语句集,经编译创建并保存在数据库中,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。
Demo_Null
2020/09/28
13.6K0
MySQL 存储过程
mysql存储过程
(如果存储过程存在删除后创建!如果不写只能执行一次) 2.DELIMITER //
用户5899361
2020/12/07
9.6K0
Mysql存储过程
1、添加存储过程 DELIMITER // CREATE PROCEDURE AddLLdata( in L_Longitude double , in L_Latitude double, IN L_Elevation double, IN L_LaserHeight double , IN L_FollowHeight double , IN L_PlaneId varchar(255), IN L_FlyDate longtext ) BEGIN insert into lldata(Lon
用户7053485
2020/06/19
9K0
MySQL存储过程
1、提高代码的重用性 2、简化操作 3、减少了编译次数并且减少了和数据库服务器的连接次数,提高了效率
程序猿的栖息地
2022/04/29
9K0
MySQL 存储过程
存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。在数据量特别庞大的情况下利用存储过程能达到倍速的效率提升
星哥玩云
2022/09/15
37.4K0
MySQL 存储过程
mysql存储过程
1)“存储过程和函数”:类似于java中的方法,python中的函数。 2)“使用存储过程的好处”:   ① 提高代码的重用性;   ② 简化操作;   ③ 减少了编译次数,并且减少了和数据库服务器的连接次数,提高了效率。    注意:每执行一句sql语句,就会连接mysql服务器一次。 3)“存储过程的含义”:一组预先编译好的sQL语句的集合。
数据分析与统计学之美
2022/05/09
11.8K0
mysql存储过程
MySQL(存储过程)
存储过程是一组已经预先编译好的SQL语句的集合,可以理解为批处理语句(增加流程控制语句),一般在复杂的业务逻辑中才会使用存储过程。
全栈开发日记
2022/05/12
11.9K0
MySQL(存储过程)
MySQL存储过程
可惜啊!MySQL目前并不支持在SQL语句中存在流控制语句,例如上面的IF NOT EXISTS THEN END IF;让人痛心疾首。但是我们可以使用存储过程完成上面要求的功能。
恋喵大鲤鱼
2018/08/03
11.4K0
MySQL存储过程
【MySQL】存储过程
1、解耦合。数据库部分可交由专门的数据库管理人员去做,像前后端联合协作那样提供接口供后端调度。(这两天对后端开发又有了新的理解:作为前端和数据库之间数据转接的中间人。不论是哪种业务,后端架构如何发展,不都是为了数据走的更顺畅点吗?)作为后端开发人员,SQL是必备语言,但是如果条件允许,专业的事情交给专业的人来做。
看、未来
2021/12/20
8K0
mysql存储过程
CONCAT(person_no,"号犯人住", i , "号床位"); ---字符串拼接
用户5927264
2019/07/31
8.3K0
MySQL 存储过程
存储过程(Stored Procedure)是一种存储在数据库中的程序,可供外部程序调用的一种数据库对象。
恋喵大鲤鱼
2023/10/12
4570
MySQL 存储过程
Mysql存储过程
存储过程就是一条或者多条SQL语句的集合,可以视为批文件。它可以定义批量插入的语句,也可以定义一个接收不同条件的SQL。
用户3467126
2019/08/29
6.8K0
Mysql存储过程
存储过程简单来说,就是为以后的使用而保存的一条或多条MySQL语句的集合。可将其视为批文件。虽然他们的作用不仅限于批处理。
Java架构师历程
2018/09/26
6.2K0

相似问题

MySQL存储过程优化

10

Mysql存储过程的查询优化

11

MYSQL存储过程插入失败

22

MySQL存储过程插入验证

12

MySQL存储过程插入问题

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档