Spring Security自定义登陆界面和密码验证逻辑

maven依赖


    org.springframework.boot
    spring-boot-starter-security

创建配置文件处理跳转拦截等功能以及密码比对功能

package com.example.demo2.demos.web1;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

@Configuration
@EnableWebSecurity
public class WebConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    UserDateService userDateService;
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        /**
         *  1. 允许访问路径"/"或者"/home",而不需要登录。
         *  除过"/"或者"/home",其他页面都需要登录。
         *  2. 表单登录,路径是"/login",允许所有用户都可以发起登录操作
         *  3. 允许所有用户都可以退出登录
         */
        http
             .formLogin()
                .loginPage("/login.html")    //登录页面设置
                //配置从前端传递过来的用户名和密码字段名
                //.usernameParameter("name")
				//.passwordParameter("password")
                .loginProcessingUrl("/user/login")   //点击登录后访问的路径
                .defaultSuccessUrl("/index.html").permitAll()   //登录成功后跳转路        
                    径,permitAll表示无条件进行访问
                .and()
             .authorizeRequests()
                .mvcMatchers("/","/user/login").permitAll() //设置不需要认证可以直接访问的 
                 路径
                .anyRequest().authenticated()
                //关闭csrf
                .and().csrf().disable()
             .logout()
                .logoutUrl("/logout")
                .logoutSuccessUrl("/login?logout")
                .permitAll();
    }
    //密码加密
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
    //密码比对
    @Autowired
    public void configure(AuthenticationManagerBuilder auth) throws Exception {
            auth.userDetailsService(userDateService);
    }
}

创建userservice

package com.example.demo2.demos.web1;

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.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;

import java.util.ArrayList;

/**
 * @author FAN BOY
 * @version 1.0
 * @date 2020/7/20 14:22
 */
@Service
public class UserDateService implements UserDetailsService {

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
        //这是通过username查询获取一组数据将获得的数据传给security的User
        //sql语句自己写
        com.example.demo2.demos.web2.User user =new com.example.demo2.demos.web2.User("admin",passwordEncoder.encode("123"),12);
        //这里我们使用静态类来模拟通过数据库获取的user类
//        if (user == null) {
//            throw new UsernameNotFoundException("该用户不存在!");
//        }
        //把获得的账号密码传给security的User
        //注意此时的User是security自带的的User类,第一个参数为用户名,第
二个为密码,一般来说我们从数据库获取的为加密后的密码,所以我们通过上面配置
文件的密码加密自己进行加密,第三个为权限角色,我没有做处理
      return new User(user.getUsername(),user.getPassword(),new ArrayList<>());
    }
}

自定义登陆界面login.html




    
    登录页面


//注意用户名和密码 为username和password,security默认为这 两个字段,如果你要用其他的名称,需要在第一个配置文件中的 loginForm中进行配置 用户名:
密码:

上面的UserDateService 中我们固定返回一个用户名密码为admin        123的user类

然后security的configure(AuthenticationManagerBuilder auth)进行密码对比,注意这里只是比较密码,因为你既然返回user类了就说明你的username是存在的,(小问题,一般来说不会有问题因为我是固定返回的一个类,我在前端只要是密码输入正确就能登陆~)

上面就实现了一个自定义登陆界面以及密码验证的基本功能的(由于公司电脑不让本地装数据库,就用静态类代替了,如果要链接数据库也就是添加一个查询数据库方法而已)。

你可能感兴趣的:(spring,java,前端,security)