SpringSecurity设置登录账号密码的三种方式

一、SpringBoot整合SpringSecurity:

1.新建SpringBoot工程,引入SpringSecurity依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

2.编写一个测试Controller

@RestController
@RequestMapping("/test")
public class HelloController {

    @GetMapping("hello")
    public String hello() {
        return "hello";
    }
}

 3.修改访问端口(默认8080)

4.启动SpringBoot工程,访问http://localhost:8001/test/hello

 如上自动跳转到登录页面,输入账号user,密码在控制台输出,如下所示

 5.查看是否登录成功(如下所示即为登录成功)

 二、自定义账号密码的三种方式

1、方式一:通过配置文件

spring.security.user.name=admin
spring.security.user.password=111111

 如上所示,修改配置文件后,重新启动服务及修改为上面的登录账号和密码

2.方式二:通过配置类

2.1.新建一个配置类,继承 WebSecurityConfigurerAdapter,并重写configure()方法

package com.atguigu.securitydemo.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

/**
 * @author cy
 * @create 2022-08-16 15:33
 */
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
        String password = passwordEncoder.encode("123");
        auth.inMemoryAuthentication().withUser("lucy").password(password).roles("admin");
    }

    @Bean
    PasswordEncoder password() {
        return new BCryptPasswordEncoder();
    }
}

3.方式三:自定义编写配置类(常用)

第一步:编写配置类,设置使用那个userDetailsService实现类

package com.atguigu.securitydemo.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

/**
 * @author cy
 * @create 2022-08-16 15:33
 */
@Configuration
public class SecurityConfigTest extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsService userDetailsService;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(password());
    }

    @Bean
    PasswordEncoder password() {
        return new BCryptPasswordEncoder();
    }
}

第二步:编写实现类,返回User对象,User对象有用户名密码和操作权限

注意:@Service("userDetailsService")里的userDetailsService要和SecurityConfigTest类中注入的private UserDetailsService userDetailsService保持一致。

package com.atguigu.securitydemo.service;

import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @author cy
 * @create 2022-08-16 15:51
 */
@Service("userDetailsService")
public class MyUserDetailService implements UserDetailsService {

    @Override
    public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
        List<GrantedAuthority> auths = AuthorityUtils.commaSeparatedStringToAuthorityList("role");
        return new User("mary",new BCryptPasswordEncoder().encode("123"),auths);
    }
}

暂时这样写,实际需要通过查询数据库,完善用户信息。因为User实现了UserDetails接口,所以返回值直接new一个User对象。

 三、Demo地址

securitydemo: SpringSecurityDemo

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Security 是一个强大的安全框架,提供了很多安全措施,包括身份认证、授权、攻击防护等。 要实现账号密码登录,首先需要配置一个登录页面和接收登录请求的控制器。在 Spring Security 的配置文件中,可以使用 `formLogin()` 方法配置登录页面和登录请求的控制器。示例代码如下: ```java @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private UserDetailsService userDetailsService; @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/login", "/css/**", "/js/**").permitAll() .anyRequest().authenticated() .and() .formLogin() .loginPage("/login") .loginProcessingUrl("/login") .defaultSuccessUrl("/home") .failureUrl("/login?error") .usernameParameter("username") .passwordParameter("password") .permitAll() .and() .logout() .logoutUrl("/logout") .logoutSuccessUrl("/login?logout") .permitAll(); } @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userDetailsService); } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } } ``` 上述代码中,`configure()` 方法中配置了登录页面、登录请求的控制器、登录成功后跳转的页面、登录失败后跳转的页面以及用户名和密码的参数名等信息。`configureGlobal()` 方法中配置了自定义的 `UserDetailsService`。`passwordEncoder()` 方法中配置了密码加密方式,本例使用了 BCrypt 加密方式。 在自定义的 `UserDetailsService` 实现中,需要根据用户名获取用户信息,包括用户名、密码和角色等信息。 ```java @Service public class UserDetailsServiceImpl implements UserDetailsService { @Autowired private UserRepository userRepository; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { User user = userRepository.findByUsername(username); if (user == null) { throw new UsernameNotFoundException("User not found"); } return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), getAuthorities(user)); } private List<GrantedAuthority> getAuthorities(User user) { List<GrantedAuthority> authorities = new ArrayList<>(); for (Role role : user.getRoles()) { authorities.add(new SimpleGrantedAuthority(role.getName())); } return authorities; } } ``` 上述代码中,`loadUserByUsername()` 方法根据用户名从 UserRepository 中获取用户信息,并返回一个 `UserDetails` 对象。`getAuthorities()` 方法根据用户的角色信息返回用户的权限列表。这里使用了 `SimpleGrantedAuthority` 类来表示权限。 这样,就可以使用 Spring Security 实现账号密码登录了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值