五SpringSecurity Web权限方案——自定义登录页面与权限访问控制

Posted 上善若水

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了五SpringSecurity Web权限方案——自定义登录页面与权限访问控制相关的知识,希望对你有一定的参考价值。

一、自定义登录页面

参考链接:Spring Security 中 defaultSuccessUrl 和 successForwardUrl 的区别

1.1、项目结构

1.2、编写登录页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/user/login" method="post">
    用户名:<input type="text" name="username"/>
    <br/>
    密 码:<input type="password" name="password"/>
    <br/>
    <input type="submit" name="login" value="登录"/>
</form>
</body>
</html>

注意:页面提交方式必须为 post 请求,所以上面的页面不能使用,用户名,密码必须为
username,password
原因:
在执行登录的时候会走一个过滤器 UsernamePasswordAuthenticationFilter

如果修改配置可以调用 usernameParameter()passwordParameter()方法。

1.3、编写config配置类

package com.xbmu.config;

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


@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter 

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

    @Override
    protected void configure(HttpSecurity http) throws Exception 
        http.formLogin() // 自定义登录页面
                .loginPage("/login.html") // 设置登录页面
                .loginProcessingUrl("/user/login") // 登录请求访问路径
                .defaultSuccessUrl("/user/index").permitAll() // 登录成功之后,跳转的路径。

                .and().authorizeRequests()
                .antMatchers("/", "/hello/sayHello", "/user/login").permitAll() // 设置那些请求路径可以直接访问,不需要认证

                .anyRequest().authenticated() // 设置其他请求需要认证

                .and().csrf().disable(); // 关闭csrf防护
    


1.4、编写UserDetailsService接口的实现类LoginService,实现登录逻辑。

package com.xbmu.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.xbmu.entity.Users;
import com.xbmu.mapper.UserMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
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.stereotype.Service;

import java.util.List;

@Service
@Slf4j
public class LoginService implements UserDetailsService 
    @Autowired
    private UserMapper userMapper;

    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException 
        QueryWrapper<Users> wrapper = new QueryWrapper<>();
        wrapper.eq("username",username);
        Users users = userMapper.selectOne(wrapper);
        if(null == users)
            throw new UsernameNotFoundException("用户名不存在!");
        
        log.info("用户信息:"+users);
        List<GrantedAuthority> auths = AuthorityUtils.commaSeparatedStringToAuthorityList("role");
        return new User(users.getUsername(),users.getPassword(),auths);

    


1.5、编写controller

package com.xbmu.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user")
@Slf4j
public class UserController 
    @RequestMapping("login")
    public String login(String username,String password)
        log.info("======输出,用户名:,密码:======",username,password);
        return "login success";
    
    @RequestMapping("index")
    public String index()
    
        return "This is a index page";
    

    @RequestMapping("findAll")
    public String findAll()
    
        return "Get all user infos";
    

1.6、测试


二、权限访问控制

2.1、hasAuthority方法

如果当前的主体具有指定的权限,则返回true、否则返回false。

  1. 修改配置类
  2. 给用户登录主体赋予权限
  3. 测试
    当 给用户登录主体赋予admins权限 时
    List<GrantedAuthority> auths = AuthorityUtils.commaSeparatedStringToAuthorityList("admins");

    当 给用户登录主体赋予role权限 时
    List<GrantedAuthority> auths = AuthorityUtils.commaSeparatedStringToAuthorityList("role");
    没有访问权限 403

2.2、hasAnyAuthority方法

如果当前的主体有任何提供的角色(给定的作为一个逗号分隔的字符串列表)的话,返回true。

  1. 修改配置类
  2. 给用户登录主体赋予权限
  3. 测试

2.3、hasRole方法

如果用户具备给定角色, 就允许访问,否则出现403。
如果当前主体就有指定的角色,则返回true。
底层源码:

  1. 给用户添加角色
  2. 修改配置文件:
    注意配置文件中不需要添加"ROLE_",因为上述的底层代码会自动添加与之进行匹配

2.4、hasAnyRole方法

表示用户具备任何一个条件都可以访问。

  1. 给用户添加角色:
  2. 修改配置文件:

以上是关于五SpringSecurity Web权限方案——自定义登录页面与权限访问控制的主要内容,如果未能解决你的问题,请参考以下文章

四SpringSecurity Web权限方案

[SpringSecurity]web权限方案_用户注销

六SpringSecurity Web权限方案—— 基于数据库实现权限认证

六SpringSecurity Web权限方案—— 基于数据库实现权限认证

[SpringSecurity]web权限方案_用户授权_自定义403页面

四SpringSecurity Web权限方案