首页 > 其他分享 >个性化登陆认证

个性化登陆认证

时间:2024-01-17 18:15:14浏览次数:32  
标签:url springframework 认证 登陆 org import security 个性化

自定义表单登录页面

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 BrowserSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.formLogin()  //表单登陆认证方法,浏览器跳转到specurity默认登陆页面
        //http.httpBasic()//浏览器弹出登陆对话框登陆认证方式
        .loginPage("/login.html")//自定义登陆页面
.loginProcessingUrl("/user/login")//用户登陆表单提交接口,默认/login
        .and()
        .authorizeRequests() ////设置请求符合访问资源的权限
        .antMatchers("/login.html","/error.html")//匹配器
.permitAll()//访问这两个页面不需要认证
        .anyRequest().authenticated(); //对任何请求都要登陆认证后才能访问
    }
    @Bean
    public PasswordEncoder passwordEncoder() {
        //return NoOpPasswordEncoder.getInstance(); //已弃用
        return new BCryptPasswordEncoder();
    }
}

页面放入resources/static

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

 

表单登陆的接口默认是/login,是由UsernamePasswordAuthenticationFilter过滤器的无参构造函数处理的

框架源码

public UsernamePasswordAuthenticationFilter() {
    super(new AntPathRequestMatcher("/login", "POST"));
}

.loginProcessingUrl("/user/login")//用户登陆表单提交接口

 

改变用户登陆提交接口(不需要定义接口),由UsernamePasswordAuthenticationFilter过滤器的attemptAuthentication方法处理.

实现UsernamePasswordAuthenticationFilter的attemptAuthentication方法可自定义逻辑

框架源码

public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
    if (this.postOnly && !request.getMethod().equals("POST")) {
        throw new AuthenticationServiceException("Authentication method not supported: " + request.getMethod());
    } else {
        String username = this.obtainUsername(request);
        String password = this.obtainPassword(request);
        if (username == null) {
            username = "";
        }

        if (password == null) {
            password = "";
        }

        username = username.trim();
        UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(username, password);
        this.setDetails(request, authRequest);
        return this.getAuthenticationManager().authenticate(authRequest);
    }
}

自定义身份认证跳转

自定义表单登陆页面是一种统一的身份认证方式,有的场景不需要返回这种html的登陆页面,需要返回json,包含状态码和错误信息

1.请求的身份认证由security判断,需要认证跳转到自定义的Controller方法上,这个方法url在配置类configure方法中http.loginPage("/authentication/require")配置(登陆静态页改为url)

2.在跳转到自定义Controller方法之前,security会将这次请求缓存在HttpSeesionRequestCache类中,自定义Controller类可以设置这个类为成员属性拿到这次请求的缓存

3.跳转登陆页面是通过配置选择使用该模块的统一登陆页面,还是使用该模块的模块自定义登陆页面

4.请求url是非.html,则返回json信息

borowser模块

import com.wzl.properties.SecurityProperties;
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.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 BrowserSecurityConfig extends WebSecurityConfigurerAdapter {
    //security配置类
    @Autowired
    private SecurityProperties securityProperties;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.formLogin()  //表单登陆认证方法,浏览器跳转到specurity默认登陆页面
        //http.httpBasic()//浏览器弹出登陆对话框登陆认证方式
        //.loginPage("/login.html")//自定义登陆页面,自定义登陆url,security判断请求是否需要登陆认证,如果需要跳转该登陆页面
        .loginPage("/authentication/require")//自定义登陆url,security判断请求是否需要登陆认证,如果需要跳转该url
        .loginProcessingUrl("/user/login")//用户登陆页面提交接口
        .and()
        .authorizeRequests() ////设置请求符合访问资源的权限
        .antMatchers(securityProperties.getBrowser().getLoginPage(),"/login.html","/error.html","/authentication/require")//匹配器
        .permitAll()//匹配器匹配的请求不需要认证
        .anyRequest().authenticated() //对任何请求都要登陆认证后才能访问
        .and()
        .csrf().disable();//关闭跨域伪造关闭
    }
    @Bean
    public PasswordEncoder passwordEncoder() {
        //return NoOpPasswordEncoder.getInstance(); //已弃用
        return new BCryptPasswordEncoder();
    }
}

 

.loginPage("/authentication/require") 跳转的控制器方法

import com.wzl.properties.SecurityProperties;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.web.DefaultRedirectStrategy;
import org.springframework.security.web.RedirectStrategy;
import org.springframework.security.web.savedrequest.HttpSessionRequestCache;
import org.springframework.security.web.savedrequest.RequestCache;
import org.springframework.security.web.savedrequest.SavedRequest;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

@Slf4j
@RestController
public class BrowserSecurityController {
    //security缓存了需要身份认证的请求
    private RequestCache requestCache = new HttpSessionRequestCache();
    //跳转工具
    private RedirectStrategy redirectStrategy = new DefaultRedirectStrategy();
    //security配置类
    @Autowired
    private SecurityProperties securityProperties;
    /** .loginPage("/authentication/require")
     * 当身份认证时,跳转这里
     * @param request
     * @param response
     * @return
     */
    @GetMapping("/authentication/require")
    @ResponseStatus(code = HttpStatus.UNAUTHORIZED) //401  未授权状态码
    public ResponseEntity<Map<String,Object>> requireAuthentication(HttpServletRequest request, HttpServletResponse response) throws IOException {
        HashMap<String, Object> map = new HashMap<>();
        //从缓存中获取这次请求
        SavedRequest savedRequest = requestCache.getRequest(request, response);
        if (savedRequest!=null) {
            String url = savedRequest.getRedirectUrl();
            log.info("引发跳转的请求:"+url);
            //请求url是.html,跳转到登陆页
            if (StringUtils.endsWithIgnoreCase(url, ".html")) {
                //跳转的页面可以是统一的自定义登陆页面,也可以是使用该模块的模块自定义登陆面
                redirectStrategy.sendRedirect(request,response,securityProperties.getBrowser().getLoginPage());

            }
        }
        //返回需要身份认证的提示信息
        map.put("msg", "访问的服务需要身份认证,请引导用户到登录页");
        return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(map);
    }
}

配置项封装

  1. 不使用统一自定义登陆页面,通过配置当前模块自定义登陆页面
# security配置
wzl:
  security:
    browser:
      loginPage: "/myLogin.html" #当前模块resources/static/

Core模块

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;

@Data
@NoArgsConstructor
@AllArgsConstructor
@ConfigurationProperties(prefix = "wzl.security")
public class SecurityProperties {
    private BrowserProperties browser = new BrowserProperties();
}
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class BrowserProperties {
    private String loginPage = "/login.html";
}
import com.wzl.properties.SecurityProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableConfigurationProperties(SecurityProperties.class)
public class SecurityCoreConfig {
}

自定义登录成功处理

登陆成功,用户积分增加等业务。

public class MyAuthenticationSuccessHandler implements AuthenticationSuccessHandler {
    private String url;

    public MyAuthenticationSuccessHandler(String url){
        this.url = url;
    }

    @Override
    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
        User user = (User) authentication.getPrincipal();
        System.out.println(user.getPassword());//输出null,保护密码
        System.out.println(user.getUsername());
        System.out.println(user.getRoles());
        response.sendRedirect(url);
    }
}

 

//登陆成功,是否指定跳转到首页
//.defaultSuccessUrl("/main.html",true)
//.defaultSuccessUrl("/toMain",true)
.successHandler(new MyAuthenticationSuccessHandler("http://www.baidu.com"))

自定义登陆失败处理
public class MyAuthenticationFailureHandler implements AuthenticationFailureHandler {
    
    private String url;
    
    public MyAuthenticationFailureHandler(String url){
        this.url = url;
    }
    
    @Override
    public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
        response.sendRedirect(url);
    }
}

 

//.failureUrl("/error.html")
.failureHandler(new MyAuthenticationFailureHandler("http://www.baidu.com"))

标签:url,springframework,认证,登陆,org,import,security,个性化
From: https://www.cnblogs.com/wangzhilei-src/p/17970656

相关文章

  • 2024年1月CSPM-3项目管理中级认证高效备考攻略及报名
    CSPM-3中级项目管理专业人员评价,是中国标准化协会(全国项目管理标准化技术委员会秘书处),面向社会开展项目管理专业人员能力的等级证书。旨在构建多层次从业人员培养培训体系,建立健全人才职业能力评价和激励机制的要求,培养我国项目管理领域复合型人才。 【证书含金量】 ·竞聘优先·......
  • 2024年3月17日DAMA-CDGP数据治理专家认证考试开始报名
    DAMA认证为数据管理专业人士提供职业目标晋升规划,彰显了职业发展里程碑及发展阶梯定义,帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力,促进开展工作实践应用及实际问题解决,形成企业所需的新数字经济下的核心职业竞争能力。DAMA是数据管理方面的认证,帮助数据从业者提升......
  • 163邮箱登陆GPT:解锁智能交流的全新体验
    在当今数字化的社会中,电子邮件已经成为人们沟通、工作和信息传递的不可或缺的工具。其中,163邮箱作为中国最受欢迎的邮件服务提供商之一,一直以来都在为用户提供稳定、安全的电子邮件服务。近年来,随着人工智能技术的迅猛发展,有人开始思考,能否将163邮箱与GPT(GenerativePre-trainedTr......
  • 信息安全认证 | CISP考试说明
    注册信息安全专业人员(CertifiedInformationSecurityProfessional,简称“CISP"),是由中国信息安全测评中心依据中编办赋予的职能,建立和发展的一整套完整的信息安全保障人才培训体系。CISP证书是国家对信息安全专业人员能力的最高认可。01证书价值1.权威性CISP是由中国信息安全测评......
  • 基于rest_framework的ModelViewSet类编写登录视图和认证视图
    背景:看了博主一抹浅笑的rest_framework认证模板,发现登录视图函数是基于APIView类封装。优化:使用ModelViewSet类通过重写create方法编写登录函数。环境:既然接触到rest_framework的使用,相信已经搭建好相关环境了。1建立模型编写模型类#models.pyfromdjango.dbimportmodel......
  • 玩转ig之Instagram蓝勾认证教程与条件
    蓝勾是 Instagram 用于身份验证的标志,它表明你的账号是真实且唯一的。拥有蓝勾的账号在 Instagram 上更容易引起关注。用户会比较倾向于信任与被认证的账号,因为他们认为这些账号具有更高的权威性和公信力。所以对于品牌来说,想要在 Instagram 上获得更好的营销效果,蓝勾认证是......
  • 山东普正与KeyarchOS完成浪潮信息澎湃技术认证
    日前,山东普正信息技术有限公司(简称山东普正)PBackupV2与云峦操作系统KeyarchOSV5完成浪潮信息澎湃技术认证。经双方联合测试, 双方产品功能兼容性良好,整体运行流畅,性能表现优异,满足用户需求。浪潮信息澎湃技术认证是基于多元、创新的通用计算平台,与供应链及软件服务等生态合作伙......
  • SpringSecurity表单认证(二)
    用户名+密码系统默认登录用户名:user密码每次服务启动后随机生成密码用户信息获取原理(数据库获取)实现该接口,security默认自动生成密码关闭。框架源码:packageorg.springframework.security.core.userdetails;publicinterfaceUserDetailsService{UserDetailsloa......
  • Outlook邮箱登陆技巧有什么
    在数字时代,电子邮件已经成为我们日常沟通和工作的不可或缺的一部分。而Outlook邮箱作为一款强大而又广受欢迎的电子邮件客户端,其功能之丰富使得许多用户对其爱不释手。然而,要充分发挥Outlook的威力,熟知一些登陆技巧是至关重要的。在本文中,我们将探讨一些Outlook邮箱登陆的技巧,以便......
  • 认证授权JWT
    JWT1、从JWT的全称可以看出,JWT本身也是Token,一种规范化之后的JSON结构的Token。JWT自身包含了身份验证所需要的所有信息,因此,我们的服务器不需要存储Session信息。这显然增加了系统的可用性和伸缩性,大大减轻了服务端的压力(因为session还需要保存,但是jwt只要签名验证......