【spring系列】spring security入門

​ spring security作爲spring的親兒子,在進行web開發的時候,可以進行一個優雅的權限控制。筆者說來慚愧,工作n多年一直沒有機會深入研究此框架。如有不對的地方望大家指正。

spring boot引入

maven引入jar

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

spring security入門很簡單,引入jar之後,spring security默認會對所有的後臺接口進行權限控制。引入之後隨意訪問接口都需要登錄

在這裏插入圖片描述

​ 默認賬號:user。 密碼每次啓動會在控制檯進行打印,如下圖。輸入賬號密碼即可。 在這裏插入圖片描述

​ 至此spring security已經引入成功,但是如此並不能完成正常的開發。總會有很多問題,如何實現自己的賬號密碼登錄呢?這個session是怎麼控制的,多臺服務器之後怎麼處理等等。接下來進行示例。

自定義用戶認證

默認的登錄不能實現我的需求,賬號密碼驗證我要自己實現,其他的所有接口都需要登錄之後才能訪問。

聲明密碼加密解密方式

    @Bean
    public PasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }

實現UserDetailsService,這個接口是用來驗證用戶信息的

@Component
public class UserAuthService implements UserDetailsService {
    @Autowired
    public PasswordEncoder passwordEncoder;
    @Override
    public UserDetails loadUserByUsername(String userName) throws UsernameNotFoundException {
        System.out.println("登錄用戶信息:"+userName);
        // todo 此處根據用戶信息查詢賬號密碼,這裏返回 111111
        // 用戶類型爲admin
        // 這裏直接進行加密操作,實際上是從數據庫查詢出來的加密字符串
        return new User(userName,passwordEncoder.encode("111111"), AuthorityUtils.commaSeparatedStringToAuthorityList("admin"));
    }
}

如此操作,即可實現用戶密碼驗證方式。

PasswordEncoder是框架自帶的一種加密方式,當然我們也可以自己實現加密解密方式。

MD5加密

md5加密工具類

public static String encode(String password) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            md.update(password.getBytes());

            byte[] byteDigest = md.digest();

            int i;
            StringBuffer buf = new StringBuffer("");
            for (int offset = 0; offset < byteDigest.length; offset++) {
                i = byteDigest[offset];

                if (i < 0) {
                    i += 256;
                }
                if (i < 16) {
                    buf.append("0");
                }

                buf.append(Integer.toHexString(i));
            } 
            // 32位加密
            return buf.toString();
            // 16位加密
            // return buf.toString().substring(8, 24);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            return null;
        }
    }

PasswordEncoder是加密解密的接口,matches方法進行對比,encode方法進行加密。

public class Md5PasswordEncoder implements PasswordEncoder {
    @Override
    public boolean matches(CharSequence rawPassword, String encodedPassword) {
        return encodedPassword.equals(MD5Util.encode((rawPassword.toString())));
    }

    @Override
    public String encode(CharSequence rawPassword) {
        return MD5Util.encode((String)rawPassword);
    }
}

更多參考資料到:spring security官方地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章