天天看點

SpringSecurity筆記(一)

簡單案例

建立springboot工程、引入 spring-boot-starter-security 依賴,編寫controller層,在通路接口方法時會跳轉到springsecurity的預設登入頁面 ,如下:

SpringSecurity筆記(一)
預設使用者名:user
 登入密碼在控制台可以找到
           

web權限方案

1、設定登入的使用者名和密碼

方式一:通過配置檔案

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

方式二:通過配置類

package com.ice.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

/**
 * @author 紫風
 * @date 2021年08月05日 18:25
 */
@Configuration
public class SecurityConfig  extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().passwordEncoder(new BCryptPasswordEncoder())
                .withUser("admin").password(new BCryptPasswordEncoder().encode("123456")).roles("admin")
                .and()
                .withUser("user").password(new BCryptPasswordEncoder().encode("123456")).roles("admin")
                .and()
                .withUser("guest").password(new BCryptPasswordEncoder().encode("123456")).roles("admin");
   
    }
}

           

方式三:自定義編寫實作類

1、編寫接口UserDetailsService實作類,傳回User對象,User對象裡有使用者名、密碼和操作權限

package com.ice.service;

import com.ice.mapper.MemberMapper;
import com.ice.pojo.Member;
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.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @author 紫風
 * @date 2021年08月05日 22:18
 */
//注入userDetailsService對象
@Service("userDetailsService")
//得到使用者密碼并傳回user對象
public class MyUserDetailsService implements UserDetailsService {
    @Autowired
    private MemberMapper memberMapper;

    @Override
    public UserDetails loadUserByUsername(String userid) throws UsernameNotFoundException {
//        調用memberMapper的方法查詢資料庫
//        根據使用者名查詢資料庫
        Member member = memberMapper.selectByusername(userid);
//        判斷使用者是否存在
        if (member == null) {
            throw new UsernameNotFoundException("使用者不存在");
        }
        List<GrantedAuthority> auths =
                AuthorityUtils.commaSeparatedStringToAuthorityList("admin");
//        從查詢資料庫傳回users對象,得到使用者名和密碼,傳回users
        return new User(member.getUserid(),
                new BCryptPasswordEncoder().encode(member.getPassword()), auths);
    }
}

           

2、編寫配置類,繼承WebSecurityConfigurerAdapter,注入userDetailsService,并設定使用userDetailsService傳回的 UserDetails中的Username,password屬性(會與登入傳回來的username、password作認證對比),即資料庫查出來的使用者名和密碼

源碼分析

1、 UserDetailsService

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package org.springframework.security.core.userdetails;

public interface UserDetailsService {
    UserDetails loadUserByUsername(String var1) throws UsernameNotFoundException;
}

           

2、 UserDetails

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package org.springframework.security.core.userdetails;

import java.io.Serializable;
import java.util.Collection;
import org.springframework.security.core.GrantedAuthority;

public interface UserDetails extends Serializable {
    Collection<? extends GrantedAuthority> getAuthorities();

    String getPassword();

    String getUsername();

    boolean isAccountNonExpired();

    boolean isAccountNonLocked();

    boolean isCredentialsNonExpired();

    boolean isEnabled();
}
           

整合mybatis 完成資料庫操作

1、引入相關依賴

<dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.0</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!--mybatis代碼生成器-->
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.4.0</version>
        </dependency>

           

2、代碼生成器生成pojo、sql映射類·、mapper接口類

3、在MyUserDetailsService調用mapper接口的方法查詢資料庫進行使用者認證(上面已經寫好)

4、在啟動類添加注解 @MapperScan(“com.ice.mapper.MemberMapper”)

package com.ice;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan("com.ice.mapper.MemberMapper")
public class Security5Application {

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

}
           

5、配置檔案配置好資料庫資訊

server.port=8080
#spring.security.user.name=admin
#spring.security.user.password=admin
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/ssmcards?serverTimezone=GMT&useUnicode=true&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=111aaa