springsecurity 在 WebSecurityConfigurerAdapter弃用后,jdbc实现登录功能

 Spring Security without the WebSecurityConfigurerAdaptericon-default.png?t=N5F7https://spring.io/blog/2022/02/21/spring-security-without-the-websecurityconfigureradapter#ldap-authentication有需要可以看一下这篇文章

这个只是自己写的一个小demo,可能不适用所有人!

    1.首先spingsecurity登录所需要的User类型必须要是UserDetails

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Userlogin implements UserDetails,GrantedAuthority {
    String username;
    String userpassword;
    String role;

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        ArrayList<GrantedAuthority> list = new ArrayList();
        GrantedAuthority authority = new GrantedAuthority() {
            @Override
            public String getAuthority() {
                return role;
            }
        };
        list.add(authority);
        return list;
    }

    @Override
    public String getPassword() {
        return userpassword;
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

//    密码是否过期
    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return true;
    }

    @Override
    public String getAuthority() {
        return this.role;
    }
}

2.GrantedAuthority 这个接口一般不是加在这里的,但是因为是个小demo就无所谓了。

其中Collection<? extends GrantedAuthority>这个集合是要存放的这个用户所拥有的权限集合(可以理解因为一个项目里一个用户会有多个权限)

写完实体类到service


public interface UserService extends UserDetailsService {

    Userlogin queryUserByName(String username);

}

实现类

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    UserloginMapper userloginMapper;
    @Override
    public Userlogin queryUserByName(String username) {
        Userlogin userlogin = userloginMapper.queryUserByName(username);
        if (userlogin == null) {
            return null;
        } else {
            return userlogin;
        }
    }

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        Userlogin userlogin = userloginMapper.queryUserByName(username);
        if (userlogin==null) {
            throw new UsernameNotFoundException("用户名不存在");
        }
        return userlogin;
    }
}

Dao使用的是mybatis这里就不说了,因为不是重点

config,重点!

@Configuration
@EnableWebSecurity
public class securityConfig {

    @Autowired
    UserService userService;

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {

        System.out.println("=================securityFilterChain==================");

        http.authorizeRequests()
                .antMatchers("/vip1*").hasRole("vip1")
                .antMatchers("/vip2*").hasRole("vip2")
                
                .and()
                .csrf().disable()
                
                .formLogin()
                .loginPage("/index")
                .permitAll()
                .usernameParameter("username")
                .passwordParameter("password")
                .defaultSuccessUrl("/dashboard")
                .loginProcessingUrl("/dologin")
                .permitAll();

     return http.build();
     }

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
                .authorizeHttpRequests((authz) -> authz
                        .anyRequest().authenticated()
                )
                .httpBasic(withDefaults());
        return http.build();
    }

    @Bean
    AuthenticationManager authenticationManager(HttpSecurity httpSecurity) throws Exception {
        System.out.println("=================authenticationManager==================");
        AuthenticationManager authenticationManager = httpSecurity.getSharedObject(AuthenticationManagerBuilder.class)
                .userDetailsService(userService)
                .passwordEncoder(new MyPasswordEncoder())
                .and()
                .build();
        return authenticationManager;
    }

}

mypasswordencoder

@Component
public class MyPasswordEncoder implements PasswordEncoder {
    @Override
    public String encode(CharSequence rawPassword) {
        return rawPassword.toString();
    }

    @Override
    public boolean matches(CharSequence rawPassword, String encodedPassword) {
        return encodedPassword.equals(rawPassword.toString());
    }
}

到这里基本配置就完成了

注意:                .usernameParameter("username")  form表单的变量注意是否一致! ( 默认的当我没说 )
                .passwordParameter("password")
                .defaultSuccessUrl("/dashboard")  表示的是登录成功后跳转的页面
                .loginProcessingUrl("/dologin")   

        表示springsecurity需要拦截什么请求,并且执行自己写的springsecurity登录接口

 到这里时我就发现其实controller只需要配置最简单的页面跳转就可以了

controller

@Controller
public class securityController {

    @RequestMapping("/index")
    public String tologin(){

        return "index";
    }

//    @RequestMapping("/login")
    @ResponseBody
//    public String securitylogin(HttpServletRequest request) {

//        System.out.printf("luguo....");
//        return "dashboard";
//    }
    
    @RequestMapping("/dashboard")
    public String login(){
        return "dashboard";
    }
    @RequestMapping("/list")
    public String list(){

        return "list";
    }
@Controller
public class vipController {

    @RequestMapping("/vip{v}")
    public String vip(@PathVariable("v") Integer v) {

        return "vip" + v;
    }

}

登陆页

	<body class="text-center">
		<form class="form-signin"  action="/dologin" method="post">
<!--			<img class="mb-4" th:src="@{/img/bootstrap-solid.svg}" alt="" width="72" height="72">-->
			<h1 class="h3 mb-3 font-weight-normal" th:text="#{login.tip}"></h1>
			<p style="color: red" th:if="${not #strings.isEmpty(msg)}" th:text="${msg}"></p>
			<label class="sr-only" th:text="#{login.Username}"></label>
			<input type="text" name="username" class="form-control" th:placeholder="#{login.Username}" required="" autofocus="">
			<label class="sr-only" th:text="#{login.password}"></label>
			<input type="password" name="password" class="form-control" th:placeholder="#{login.password}" required="">
			<div class="checkbox mb-3">
				<label>
          <input type="checkbox" value="remember-me" th:text="#{login.remember}">
        </label>
			</div>
			<button class="btn btn-lg btn-primary btn-block" type="submit" th:text="#{login.sign}">Sign in</button>
			<p class="mt-5 mb-3 text-muted">© 2023-2024</p>
			<a class="btn btn-sm" th:href="@{/index.html(l='zh_CN')}">中文</a>
			<a class="btn btn-sm" th:href="@{/index.html(l='en_US')}">English</a>
		</form>

	</body>

 

差点忘了, role 必须要是ROLE_ 开头的

最后祝大家不要像我一样卡在这里  T.T

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 创建一个Spring Boot项目,并添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> </dependency> ``` 2. 创建一个用户实体类和一个用户DAO接口,用于查询用户信息。 ```java public class User { private Long id; private String username; private String password; private List<String> roles; // getter and setter } public interface UserDAO { User findByUsername(String username); } ``` 3. 创建一个自定义的UserDetailsService,用于加载用户信息,并实现UserDetails接口。 ```java @Service public class UserDetailsServiceImpl implements UserDetailsService { @Autowired private UserDAO userDAO; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { User user = userDAO.findByUsername(username); if (user == null) { throw new UsernameNotFoundException("User not found"); } return new org.springframework.security.core.userdetails.User( user.getUsername(), user.getPassword(), AuthorityUtils.createAuthorityList(user.getRoles().toArray(new String[0])) ); } } ``` 4. 创建一个SecurityConfig类,用于配置Spring Security。 ```java @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private UserDetailsService userDetailsService; @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/admin/**").hasRole("ADMIN") .anyRequest().authenticated() .and() .formLogin() .and() .logout() .logoutUrl("/logout") .logoutSuccessUrl("/") .invalidateHttpSession(true) .deleteCookies("JSESSIONID") .and() .csrf().disable(); } @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userDetailsService); } } ``` 5. 创建一个AdminController类,用于测试权限控制。 ```java @RestController @RequestMapping("/admin") public class AdminController { @GetMapping("/hello") public String hello() { return "Hello, Admin!"; } } ``` 6. 在application.properties中配置MyBatis和数据库信息。 ```properties mybatis.mapper-locations=classpath:mapper/*.xml spring.datasource.url=jdbc:mysql://localhost:3306/test?useSSL=false&useUnicode=true&characterEncoding=UTF-8 spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver ``` 7. 创建一个测试类,测试权限控制。 ```java @RunWith(SpringRunner.class) @SpringBootTest public class SecurityTest { @Autowired private WebApplicationContext context; private MockMvc mockMvc; @Before public void setUp() { mockMvc = MockMvcBuilders.webAppContextSetup(context).apply(springSecurity()).build(); } @Test public void testAdmin() throws Exception { mockMvc.perform(get("/admin/hello") .with(user("admin").password("admin").roles("ADMIN"))) .andExpect(status().isOk()) .andExpect(content().string("Hello, Admin!")); } @Test public void testUser() throws Exception { mockMvc.perform(get("/admin/hello") .with(user("user").password("user").roles("USER"))) .andExpect(status().isForbidden()); } } ``` 运行测试类,可以看到测试通过,权限控制生效。 以上就是使用Spring Boot整合Spring Security和MyBatis实现权限管理的简单示例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值