• 012 自定义用户认证逻辑


    一:任务

    1.任务

      处理用户信息获取逻辑

      处理用户校验逻辑

      处理密码加密与解密

    二: 获取用户信息

    1.说明

      这个获取用户信息的意思是什么呢?

      就是在登录界面,输入用户名,然后后台可以接收到,并且,可以自己到数据库去查找用户的信息了。

      security接受用户的接口如下:

      

    2.程序

      这里没有写查询程序,这里这里已经是spring中的一个bean了,可以导入dao了

     1 package com.cao.security.browser;
     2 
     3 import org.slf4j.Logger;
     4 import org.slf4j.LoggerFactory;
     5 import org.springframework.security.core.authority.AuthorityUtils;
     6 import org.springframework.security.core.userdetails.User;
     7 import org.springframework.security.core.userdetails.UserDetails;
     8 import org.springframework.security.core.userdetails.UserDetailsService;
     9 import org.springframework.security.core.userdetails.UsernameNotFoundException;
    10 import org.springframework.stereotype.Component;
    11 @Component
    12 public class MyUserDetailsService implements UserDetailsService {
    13     private Logger logger=LoggerFactory.getLogger(getClass());
    14 
    15     @Override
    16     public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    17         logger.info("userName:"+username);
    18         //根据用户名,可以查找用户信息,做一些操作
    19         //User(username, password, authorities),这个User实现了UserDetails
    20         return new User(username, "123456", AuthorityUtils.commaSeparatedStringToAuthorityList("admin"));
    21     }
    22 
    23 }

    3.登录

      

      控制台:

      

    三:处理用户校验逻辑

    1.校验

      密码是否正确,密码是否过期,账户是否被锁定  等的校验

      UserDetails:封装了用户登录所需要的所有信息

      

    2.程序

     1 package com.cao.security.browser;
     2 
     3 import org.slf4j.Logger;
     4 import org.slf4j.LoggerFactory;
     5 import org.springframework.security.core.authority.AuthorityUtils;
     6 import org.springframework.security.core.userdetails.User;
     7 import org.springframework.security.core.userdetails.UserDetails;
     8 import org.springframework.security.core.userdetails.UserDetailsService;
     9 import org.springframework.security.core.userdetails.UsernameNotFoundException;
    10 import org.springframework.stereotype.Component;
    11 @Component
    12 public class MyUserDetailsService implements UserDetailsService {
    13     private Logger logger=LoggerFactory.getLogger(getClass());
    14 
    15     @Override
    16     public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    17         logger.info("userName:"+username);
    18         //根据用户名,可以查找用户信息,做一些操作
    19         /**
    20          * 简单的返回用户
    21          *  User(username, password, authorities),这个User实现了UserDetails
    22             return new User(username, "123456", AuthorityUtils.commaSeparatedStringToAuthorityList("admin"));
    23          */
    24         /**
    25          *  这里涉及到更多的校验,需要使用更加复杂的User
    26          * new User(username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities)
    27          */
    28         return new User(username, "123456", true, true, true, false, AuthorityUtils.commaSeparatedStringToAuthorityList("admin"));
    29         
    30         
    31     }
    32 
    33 }

    3.校验

      

    四:加密与解密

    1.说明

      使用的类是PasswordEnCoder

      encode:用于加密,建议在用户注册的时候,调用一次,对密码进行加密。

      matches:用于检查加密的密码与用户的密码是否匹配,是spring调用的

      matches(CharSequence rawPassword, String encodedPassword):rawPassword是原始的密码,encodedPassword是加密的密码

      

    2.程序

      使用的加密类

     1 package com.cao.security.browser;
     2 
     3 import org.springframework.context.annotation.Bean;
     4 import org.springframework.context.annotation.Configuration;
     5 import org.springframework.security.config.annotation.web.builders.HttpSecurity;
     6 import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
     7 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
     8 import org.springframework.security.crypto.password.PasswordEncoder;
     9 /**
    10  * 覆盖掉security原有的配置
    11  * @author dell
    12  *
    13  */
    14 @Configuration
    15 public class BrowserSecurityConfig extends WebSecurityConfigurerAdapter{
    16     @Override
    17     protected void configure(HttpSecurity http) throws Exception {
    18         //表单登陆的一个安全认证环境
    19         http.formLogin()
    20 //        http.httpBasic()
    21             .and()
    22             .authorizeRequests()    //请求授权
    23             .anyRequest()            //任何请求
    24             .authenticated();         //都需要认证
    25         
    26     }
    27     
    28     @Bean
    29     public PasswordEncoder passwordEncoder() {
    30         return new BCryptPasswordEncoder();
    31     }
    32 }

      处理加密与解密

     1 package com.cao.security.browser;
     2 
     3 import org.slf4j.Logger;
     4 import org.slf4j.LoggerFactory;
     5 import org.springframework.beans.factory.annotation.Autowired;
     6 import org.springframework.security.core.authority.AuthorityUtils;
     7 import org.springframework.security.core.userdetails.User;
     8 import org.springframework.security.core.userdetails.UserDetails;
     9 import org.springframework.security.core.userdetails.UserDetailsService;
    10 import org.springframework.security.core.userdetails.UsernameNotFoundException;
    11 import org.springframework.security.crypto.password.PasswordEncoder;
    12 import org.springframework.stereotype.Component;
    13 @Component
    14 public class MyUserDetailsService implements UserDetailsService {
    15     private Logger logger=LoggerFactory.getLogger(getClass());
    16     
    17     //做一次加密
    18     @Autowired
    19     private PasswordEncoder passwordEncoder;
    20 
    21     @Override
    22     public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    23         logger.info("登录用户userName:"+username);
    24         //根据用户名,可以查找用户信息,做一些操作
    25         /**
    26          * 简单的返回用户
    27          *  User(username, password, authorities),这个User实现了UserDetails
    28             return new User(username, "123456", AuthorityUtils.commaSeparatedStringToAuthorityList("admin"));
    29          */
    30         /**
    31          *  这里涉及到更多的校验,需要使用更加复杂的User
    32          * new User(username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities)
    33          */
    34         String password=passwordEncoder.encode("123456");
    35         logger.info("模拟的数据库密码password:"+password);
    36         return new User(username, password, true, true, true, true, AuthorityUtils.commaSeparatedStringToAuthorityList("admin"));
    37         
    38     }
    39 
    40 }

    3.效果

      说明:每次用户登录的时候,密码被加密后都不一样,但是解密后仍会是一个密码。

      

      

  • 相关阅读:
    逆向入门之路1 关于逆向工程
    EC笔记:第三部分:14、在资源管理类中小心Copying行为
    vuex最简单、最详细的入门文档
    前端加密的几种常见方式
    NAS星云链 入门之从零开发第一个DAPP
    chrome 不支持12px以下字体为题的解决
    input checkbox 多选 验证
    你对javascript的原生操作或者工具了解多少呢?
    ionic2-键盘覆盖输入框和返回键问题解决方案
    ionic2 手风琴效果
  • 原文地址:https://www.cnblogs.com/juncaoit/p/9736016.html
Copyright © 2020-2023  润新知