使用反应登录表单在 Spring Boot 中对用户进行身份验证

2024-04-13

我已将 spring security 添加到我的项目中,并且正在尝试进行用户身份验证。我正在使用 CrudRepository 来查找用户并验证详细信息是否正确。我已经能够使用开箱即用的弹簧登录页面让它工作。我的问题是我想通过我的反应登录页面对用户进行身份验证。 Spring boot 应用程序为 8080,而 React 应用程序为 3000。我见过自定义登录页面设置,但登录页面与 Spring Boot 应用程序位于同一位置。我的问题是,登录页面是否可以位于其他地方,是否有一个登录端点可以发送请求以对用户进行身份验证?或者我可以添加一些配置来告诉 spring 使用来自前端的用户详细信息来验证用户身份。

另一方面,我理解不应该使用 NoOpPasswordEncoder,这只是一个 POC,不会投入生产。谢谢

我的安全配置文件如下所示:

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.userDetailsService(userDetailsService)
}

@Override
protected void configure(HttpSecurity http) throws Exception {
             http
            .authorizeRequests()
            .antMatchers("/**").hasRole("ADMIN")
            .and()
            .formLogin();
}

@Bean
public PasswordEncoder getPasswordEncoder(){
    return NoOpPasswordEncoder.getInstance();
}

用户详细信息服务实现:

@Service
public class UserDetailsServiceImpl implements UserDetailsService {
private UserRepository userRepository;

public UserDetailsServiceImpl(UserRepository userRepository) {
    this.userRepository = userRepository;
}


@Override
public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
    Optional< UserEntity > user= userRepository.findByEmail(email);
    user.orElseThrow(()-> new UsernameNotFoundException("Not found: " + email));
    return user.map(UserInfo::new).get();
}

}

用户详细信息Impl

public class UserInfo implements UserDetails {
private String userName;
public UserInfo(UserEntity userEntity){
this.userName=userEntity.getEmail();
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
    return Arrays.asList(new SimpleGrantedAuthority("ADMIN"));
}

@Override
public String getPassword() {
    return "TestPassword";
}

@Override
public String getUsername() {
    return userName;
}

@Override
public boolean isAccountNonExpired() {
    return true;
}

@Override
public boolean isAccountNonLocked() {
    return true;
}

@Override
public boolean isCredentialsNonExpired() {
    return true;
}

@Override
public boolean isEnabled() {
    return true;
}

}

春季安全日志:

创建过滤器链:任何请求,[org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@4529048e,org.springframework.security.web.context.SecurityContextPersistenceFilter@c247b02,org.springframework.security.web.header。 HeaderWriterFilter@ecfff32,org.springframework.web.filter.CorsFilter@6addfa22,org.springframework.security.web.csrf.CsrfFilter@629cf53c,org.springframework.security.web.authentication.logout.LogoutFilter@7b38db21,org.springframework。 security.web.authentication.UsernamePasswordAuthenticationFilter@3b18009f,org.springframework.security.web.savedrequest.RequestCacheAwareFilter@78f1d29,org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@15405ba1,org.springframework.security.web.authentication.AnonymousAuthenticationFilter@ 74b521c,org.springframework.security.web.session.SessionManagementFilter@3c65f2e1,org.springframework.security.web.access.ExceptionTranslationFilter@531b1778,org.springframework.security.web.access.intercept.FilterSecurityInterceptor@458704ee]


在开发时,您可以在 package.json 文件中输入以下内容:

"proxy": "http://localhost:8080/"

至于Java Web应用程序,您可以提供自定义身份验证请求匹配器和身份验证入口点:

@Autowired
RestAuthEntryPoint restAuthEntryPoint;

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
        .antMatchers("/**").hasRole("ADMIN")
        .and()
        .exceptionHandling()
        .authenticationEntryPoint(restAuthEntryPoint) <- to support REST
        .and()
        .formLogin().loginProcessingUrl("/fooLogin"); <- credentials checked here
}

支持 REST 并处理未经授权的访问:

@Component
public class RestAuthEntryPoint implements AuthenticationEntryPoint{


@Override
public void commence(
        HttpServletRequest request,
        HttpServletResponse response,
        AuthenticationException authException) throws IOException {

    // send error response to the client (401 unauthorized)
    response.sendError( HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized" );
}

}

React中的登录表单提交(基本):

 axios({
         method:'post',
         url:'//fooLogin',
         params:{
                username: this.state.email,
                password: this.state.password
            },
         config: { headers: {'Content-Type': 'application/x-www-form-urlencoded'}}
        })
        .then(
            //authentication success...
        })
        .catch(error=>{
            var errResp = error.response;
            if(errResp.status === 401){
               //Ex: show login page again...
            }

        })
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用反应登录表单在 Spring Boot 中对用户进行身份验证 的相关文章

随机推荐

  • 进度条的可见性

    当用户在一项活动中单击按钮时 我需要处理一些数据 因此屏幕看起来应用程序停止了 2 3 秒 这不是很多 但我想向用户提供一切正常的信息 IMO 最好的方法是进度条 仅在处理数据时才可见 我找到了ProgressBar的代码 它看起来像这样
  • 如何更改类内的变量?在Python中

    我已经开始编写一个空闲游戏的代码 但稍后我会添加某种类型的输入 我的问题是我的class库存不增加int s from def砍 我的到我的variable SP wood SP stone 它只是替换variable与它得到的号码def砍
  • 从 F# 调用 C# 异步方法会导致死锁

    我有一组 F 脚本 它们调用我们创建的各种库 其中许多库公开了最初用 C 编写的异步方法 最近我发现脚本停止工作了 我想距离我上次使用它们已经有半年了 当时它们还可以工作 我试图隔离问题并提出了以下代码来重现它 首先 我们考虑一个包含以下
  • 如何在 Pandas 数据框的多列上运行 Ta-Lib?

    我有一个数据框 其中包含多种证券的价格作为列 但我找不到一次性运行 TA Lib 的解决方案 因为它需要 numpy ndarray 如何在多种证券上运行 TA Lib 并获得数据帧作为回报 import talib as ta d sec
  • 缓存 VS 会话 VS cookie?

    缓存 会话 Cookie 的注意事项是什么 例如 我经常使用会话变量 有时当用户开始订购产品然后去吃午餐并在几个小时后回来并继续预订时 预订应用程序中有时会出现问题 我将预订存储在会话中 直到用户确认或中止预订 因此当用户只需单击浏览器中的
  • 使用单选按钮 PHP SQL 过滤搜索

    我有一个有效的搜索列表 搜索的工作原理是查找搜索词是否如姓名 家庭和工作 现在我想把这个搜索分开 我的意思是 创建三个单选按钮 单击第一个按钮按姓名搜索 单击第二个按钮按家庭搜索 单击第三个按钮按工作搜索 所以我的基本代码在这里 这里需要添
  • 使用 JSON.NET 作为 ASP.NET MVC 3 中的默认 JSON 序列化器 - 可能吗?

    是否可以使用JSON NET http json codeplex com 作为 ASP NET MVC 3 中的默认 JSON 序列化器 根据我的研究 似乎实现这一目标的唯一方法是扩展操作结果 http james newtonking
  • 如何更改 Laravel 中的日期语言?

    我想将我看到的日期的语言从英语更改为法语 strftime d B Y H M strtotime article gt created at 我们可以使用另一种方法与translatedFormat Carbon setLocale fr
  • Selenium WebDriver 拖放到滚动条

    我对 Selenium WebDriver 拖放有疑问 它不想拖放到滚动条中的 webelement 我试过这个 new Actions SeleniumDriver getDriver dragAndDrop element target
  • DB2 SQLCODE=-805,SQLSTATE=51002,SQLERRMC=NULLID.SYSLH203 0X5359534C564C3031

    我收到以下错误 com ibm db2 jcc am SqlException DB2 SQL Error SQLCODE 805 SQLSTATE 51002 SQLERRMC NULLID SYSLH203 0X5359534C564C
  • Angular 4打字稿解析响应对象中的枚举接口属性

    我收到来自 API 的响应 它返回一个枚举值 从 API 返回的值在请求中表示为字符串 这个值是一个enumTypescript 接口的属性 Problem 当收到响应时 TS接口将该值存储为字符串 可能这就是问题 所以我不能直接使用它en
  • 在 Hibernate 中禁用延迟加载

    如何在 Hibernate 中禁用延迟加载 我使用的是持久性注释 而不是 hbm xml 文件 我正在按 ID 获取单个对象 并希望加载所有属性 在我使用该对象之前会话已关闭 Thanks 您需要使用 FetchType EAGER 注释您
  • java中将十进制转换为格雷码

    最近出现一个问题是 编写算法将十进制数转换为n位格雷码 例如 使用 1 位 最简单 0 gt 0 1 gt 1 使用 2 位 0 gt 00 1 gt 01 2 gt 11 3 gt 10 使用 3 位 0 gt 000 1 gt 001
  • 如何使用 if/else 语句更改全局变量

    我有这个代码我想改变var n如果var thisRoll is not green 但我只得到undefined在输出中console log n var thisRoll red var n var base bet 1 functio
  • 带 margin-left 和 width:100% 右侧溢出的 Div

    我有 2 个嵌套的 div 宽度应为 100 不幸的是 带有文本框的内部 div 溢出 并且实际上比外部 div 更大 它有一个左边距 并且溢出了大约该边距的大小 我该如何解决这个问题 div style width 100 div sty
  • 使用 ctypes 从 python 调用 C 函数

    我有以下 C 代码 我正在尝试使用Python从Python调用这个函数ctypes int add int arr printf number d n arr 0 arr 0 1 return arr 0 我用以下方法编译了这个 gcc
  • 动态包含/排除 Gitlab Pipeline 中的作业

    我有一个有几个阶段的管道 detect test build deploy The detect阶段检测应用程序的类型和test and build阶段的作业根据计算结果包含或排除detect The detectstage 将其值写入名为
  • 如何在 webkit 浏览器中访问粘贴的文件? (如谷歌浏览器)

    如果能够在 Stack Exchange 上粘贴图像而不是干扰文件对话框 那将非常方便 类似的功能在这里实现了 是 但是仅适用于 Webkit 浏览器 https meta stackexchange com a 233874 209994
  • 快速获取剪贴板更改通知

    swift 中有剪贴板更改事件吗 当 iOS 应用程序中剪贴板发生更改时 我如何收到通知 谢谢 这里有一个可以复制的迅捷5 0 version NotificationCenter default addObserver self sele
  • 使用反应登录表单在 Spring Boot 中对用户进行身份验证

    我已将 spring security 添加到我的项目中 并且正在尝试进行用户身份验证 我正在使用 CrudRepository 来查找用户并验证详细信息是否正确 我已经能够使用开箱即用的弹簧登录页面让它工作 我的问题是我想通过我的反应登录