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

如果URL中提供了某些参数,如何仅显示页面?

秦琦
2023-03-14

我想在Spring中创建一个页面,其中包含url

http://myapp.com/sign-in?email=myemail@提供商。通用域名格式

密码是用户每次想要登录时通过电子邮件收到的一次性密码。

每当用户访问此页面时,我希望发生两件事:

  1. 检查提供的凭据是否正确。
  2. 如果是,则显示页面的超文本标记语言内容。

我已经完成了第一部分:

    @Autowired
    private var userRepository: UserRepository? = null

    @GetMapping
    fun signIn(@RequestParam email:String, @RequestParam(name="pw") password:String): RedirectView {
        // Is the password correct?

        // TODO: Read password hash of the user
        val existingUser: Optional<UserInfo>? = userRepository?.findById(email)
        if (existingUser == null) {
            return redirectToErrorPage("Please register with your e-mail address first")
        }
        if (!existingUser.isPresent) {
            return redirectToErrorPage("Please register with your e-mail address first")
        }
        val hashInDb = existingUser.get().passwordHash
        val hashInParam = PasswordHashCalculator.calculateHash(password)
        if (!hashInDb.equals(hashInParam)) {
            return redirectToErrorPage("Invalid user name and/or password")
        }

        // TODO: Display the main page
        return null
    }

我需要如何更改代码才能显示主页(src/main/resources/state中的超文本标记语言文件),但前提是通过身份验证检查?

更新1:按照此处的建议使用返回类路径资源(“main.html”)没有帮助。

共有3个答案

弘承运
2023-03-14

@RobScully是对的,您不应该这样处理授权。您可以做的是启用sping-Security并使用Spring Security注释来处理这种情况。使用以下依赖项并设置基本的Spring Security设置。

在执行方法之前,可以使用诸如PreAuthorize()之类的注释来验证用户权限。如果坚持的话,您甚至可以将此注释添加到控制器方法中,以便在服务每个请求之前进行验证。

您可以设置和LDAP服务器或Oauth,甚至使用数据库进行身份验证(如果您正在进行演示或其他工作)。

        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-web</artifactId>
            <version>${spring-security.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-config</artifactId>
            <version>${spring-security.version}</version>
        </dependency>

使用如下配置类来配置安全性:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    DataSource dataSource;

    @Autowired
    public void configAuthentication(AuthenticationManagerBuilder auth) throws Exception {

      auth.jdbcAuthentication().dataSource(dataSource)
        .usersByUsernameQuery(
            "select username,password, enabled from users where username=?")
        .authoritiesByUsernameQuery(
            "select username, role from user_roles where username=?");
    }   

    @Override
    protected void configure(HttpSecurity http) throws Exception {

      http.authorizeRequests()
        .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')") //To check admin role permission
        .and()
          .formLogin().loginPage("/login").failureUrl("/login?error") //provide failure url
          .usernameParameter("username").passwordParameter("password")
        .and()
          .logout().logoutSuccessUrl("/login?logout") 
        .and()
          .exceptionHandling().accessDeniedPage("/403")
        .and()
        .csrf();
    }
}

github中的这个示例项目提供了一个可以使用Spring Security性的基本设置:

https://github.com/mohchi/spring-security-request-mapping

参考用途:https://www.mkyong.com/spring-security/spring-security-form-login-using-database/

邓昀
2023-03-14

你不应该这样做。通过http以明文形式发送密码不是一种好的做法。

这里有使用Spring Security性进行基本身份验证的示例。

https://www.baeldung.com/spring-security-basic-authentication

https://www.baeldung.com/securing-a-restful-web-service-with-spring-security

然后您可以做的是,如果您遵循本教程,为初学者分配一个内存用户。然后您可以将您的身份验证详细信息编码给该用户。然后对于每个用户,您可以发送身份验证详细信息,并且没有人可以窥探用户名和密码,因为它们会通过线路传递,并且您的请求在到达您的控制器之前得到处理。这样,您就可以将业务逻辑与身份验证分离。

这至少是一个开始。希望这有帮助。

汪阳辉
2023-03-14
return ClassPathResource("static/main.html") should answer your question, don't forget to specify `static` folder at the beginning as `ClassPathResource` points to the `resources` folder
 类似资料:
  • 我使用的是React路由器V4,我有此路由器的配置: 是可选的语言参数,它应该与模式匹配,例如、或不匹配。例如,应用程序利用这些路由: 另外,我还有一个额外的组件,在其中我定义了函数的路由: 因此,我希望实现的结果是,只接受允许的语言代码(和空参数),而不接受的代码将被重定向到组件。 可能吗?如何实现这一目标? 非常感谢这个例子

  • 问题内容: 我的页面上有很多数据,表格和内容。我想制作一个仅显示很少的选定内容的印刷版本。 我不是在写另一个仅用于打印的页面,而是在阅读CSS的“ @media print”功能。 首先,哪些浏览器支持它?由于这是一项内部功能,因此只有最新的浏览器支持它才可以。 我当时正在考虑使用“可打印”类标记一些DOM元素,并且基本上将“ display:none”应用于除具有“可打印”类的那些元素之外的所有

  • 我正在使用和来记录WebApi2项目。我有一个使用XML正文并返回文本响应的操作。我希望留档包含XML输入的示例-例如

  • 问题内容: 我正在使用JDK 1.6.0_26中的VisualVM来分析在Tomcat下运行的Java Webapp,但是VisualVM经常告诉我它没有足够的内存来拍摄快照,并使用-Xmx开关为Netbeans提供更多的内存。 。问题是,我在Netbeans之外运行VisualVM,那么如何为jvisualvm.exe提供JVM参数? 问题答案: 应该能够修改内存中的设置 并且在排队。

  • 编辑:为了确保时区对象可用: sun.util.calendar.zoneinfo[id=“欧洲/柏林”,offset=3600000,dstsavings=3600000,usedaylight=true,transitions=143,lastrule=java.util.simpletimezone[id=欧洲/柏林,offset=3600000,dstsavings=3600000,use

  • 问题内容: 在调试使用AJAX的jQuery应用程序时,我经常需要查看服务返回给浏览器的json。因此,我将JSON数据的URL放入地址栏中。 这对ASPNET很好,因为在发生编码错误的情况下,我可以在浏览器中看到ASPNET诊断错误: 但是,当服务器端代码正常工作并实际返回JSON时,IE会提示我下载它,因此看不到响应。 我可以让IE不这样做吗,换句话说,就是像纯文本一样显示它吗? 我知道如果将