当前位置: 首页 > 知识库问答 >
问题:

Spring boot更改默认身份验证系统

白浩气
2023-03-14

默认情况下,Spring Boot使用从客户端默认接受值为“/login”的HttpServletRequest

如果我想创建一个自定义身份验证系统,包括以下选项:

  1. 登录endpoint,如:/api/v1/auth/ign,将接受电子邮件和密码
  2. 而不是像YT中的许多视频所示那样创建CustomAuthFilter,而是在auth控制器中创建一个处理发送回jwt令牌的方法。

现在我已经知道,要更改默认登录路由,我需要:

. formLogin(). loginProcessingUrl("/api/v1/login")

但是下一部分呢?

我需要创建像SignInRequestSignInResponse这样的对象吗?

如果是这样,客户端应用程序是否需要根据SignInRequestSignInResponse映射数据?

这是我的注册服务:

@Override
public User signup(User user) {
    String encodedPassword = passwordEncoder.encode(user.getPassword());
    user.setPassword(encodedPassword);
    return authRepository.save(user);
}

我想为signin创建类似的服务,比如:

@Override
public User signin(String email, String password) {
   // somehow do login and return the user with access and refresh tokens?
}

即使我创建了一个SigninRequest对象,客户端应用程序也会始终发送电子邮件和密码,对吗?

由于我没有处理过复杂的后端,我对如何解决这个问题的想法非常有限。

任何见解或资源将是有益的,谢谢。

我当前的attemptAuthentication方法:

    public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
        StringBuffer sb = new StringBuffer();
        BufferedReader reader = null;
        String content = "";
        String email = "";
        String password = "";
        try {
            reader = request.getReader();
            char[] buffer = new char[1024];
            int read;
            while ((read = reader.read(buffer, 0, buffer.length)) != -1) {
                sb.append(buffer, 0, read);
            }
            content = sb.toString();
            Map<String, String> map = new ObjectMapper().readValue(content, Map.class);
            email = map.get("email");
            password = map.get("password");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException ex) {
                    try {
                        throw ex;
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
        UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(email, password);
        return authenticationManager.authenticate(authenticationToken);
    }

共有1个答案

公冶桐
2023-03-14

Spring支持许多复杂的自定义身份验证方法。Spring Security留档提供了完整的概述:

Spring Security文档-身份验证

根据您的问题,我得出结论,您希望坚持某种用户/密码身份验证。以下文件对此进行了描述:

Spring Security Docs-用户/密码验证

你基本上有三个选择:

  1. 表单登录:在这里,一个动态生成的HTML页面呈现给用户,用户可以在其中输入用户(在您的情况下是电子邮件地址)和密码
  2. 基本身份验证:这里不需要单独的HTML页面。相反,浏览器直接显示一个弹出对话框,用户在其中输入其凭证
  3. 摘要认证:非常罕见,spring不推荐。组织

再一次,从你的问题我得出结论,你想坚持表单登录。Spring为这种替代方案提供了许多选项,这些选项在上述文档中有详细介绍。

另一个好的起点是以下流行教程:

关于Spring Security表单登录的Baeldung教程

除了实现方面之外,在身份验证方法的问题中当然还有很多安全考虑:用户/密码身份验证被认为是一种相当不安全的身份验证形式,因为它需要用户和服务器之间交换秘密。更安全的表单是,例如,使用一次性密码或证书(例如,由浏览器处理的SSL客户端认证)。作为进一步阅读的起点,我可以建议:

上升堆栈-解释了Web身份验证方法

Port Swigger-身份验证漏洞

 类似资料:
  • 我正在开发ASP NET核心Web API,对认证方式的选择感到困惑。我曾经应用默认的Asp Net身份验证,但最近我知道了JWT。因此,我几乎像本文中一样实现了身份验证:https://stormpath.com/blog/token-authentication-asp-net-core。但是我不能理解这个JWT的好处。通过简单的Asp Net身份认证,我不关心令牌存储等,我只需要用signI

  • LDAP的基础是什么?如果在配置期间没有给出任何基数。 我必须从基于web的应用程序验证/验证用户,并且我有java代码。 但是我需要为此建立基础(变量),我已经让另一个团队告诉我基础,他们说我们没有在LDAP上定制任何东西。LDAP的默认基数是什么?

  • 我正在Spring Boot应用程序中学习Spring Security性,我试图了解默认情况下使用Spring Security性的身份验证方式。我知道Spring Security默认情况下使用基于表单的身份验证,但我使用基本身份验证对Postman进行了测试,结果正常。 我有一个非常简单的Spring Boot应用程序。 Rest控制器: 我在pom中添加了Spring Security依赖

  • 我正在使用SpringBoot开发具有微服务架构的Rest Backend。为了保护endpoint,我使用了JWT令牌机制。我正在使用Zuul API网关。 如果请求需要权限(来自JWT的角色),它将被转发到正确的微服务。Zuul api网关的“WebSecurityConfigrerAdapter”如下。 这样,我必须在这个类中编写每个请求授权部分。因此,我希望使用方法级安全性,即“Enabl

  • 申请认证 更新认证 获取授权用户的认证信息 申请认证 POST /user/certification 输入 名称 类型 描述 type String 必须, 认证类型,必须是 user 或者 org。 files Array\ Object 必须, 认证材料文件。必须是数组或者对象,value 为 文件ID。 name String 必须, 如果 type 是 org 那么就是负责人名字,如果

  • 本篇文档讨论如何配合 Requests 使用多种身份认证方式。 许多 web 服务都需要身份认证,并且也有多种不同的认证类型。 以下,我们会从简单到复杂概述 Requests 中可用的几种身份认证形式。 基本身份认证 许多要求身份认证的web服务都接受 HTTP Basic Auth。这是最简单的一种身份认证,并且 Requests 对这种认证方式的支持是直接开箱即可用。 以 HTTP Basic