java - 使用 Spring Security 注册创建 session

标签 java jquery spring spring-security spring-data

我正在按照构建文章 https://github.com/Baeldung/spring-security-registration 使用 Spring Security 进行注册处理。 。根据本文,HTML 页面获取输入并将其插入数据库中。

我正在前端使用 Flutter 应用程序。我希望当用户请求重置密码时,会将链接发送到用户的电子邮件,并且当用户单击验证链接时,它将创建一个 session 并重定向到应用程序上的 UI 页面写入新密码。当用户输入新密码时,它将更新该用户的密码。

updatePassword.html

<!DOCTYPE html>
<html>
<head>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css"/>
    <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"/>
    <style>
.password-verdict{
color:#000;
}

    </style>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
    <script th:src="@{/resources/pwstrength.js}"></script>
    <title th:text="#{message.updatePassword}">update password</title>
</head>
<body>
<div sec:authorize="hasAuthority('CHANGE_PASSWORD_PRIVILEGE')">
    <div class="container">
        <div class="row">
            <h1 th:text="#{message.resetYourPassword}">reset</h1>
            <form>
                <br/>

                <label class="col-sm-2" th:text="#{label.user.password}">password</label>
                <span class="col-sm-5"><input class="form-control" id="password" name="newPassword" type="password"
                                              value=""/></span>
                <div class="col-sm-12"></div>
                <br/><br/>
                <label class="col-sm-2" th:text="#{label.user.confirmPass}">confirm</label>
                <span class="col-sm-5"><input class="form-control" id="matchPassword" type="password" value=""/></span>
                <div id="globalError" class="col-sm-12 alert alert-danger" style="display:none"
                     th:text="#{PasswordMatches.user}">error
                </div>

                <div class="col-sm-12">
                    <br/><br/>
                    <button class="btn btn-primary" type="submit" onclick="savePass()"
                            th:text="#{message.updatePassword}">submit
                    </button>
                </div>
            </form>

        </div>
    </div>

    <script th:inline="javascript">
var serverContext = [[@{/}]];

$(document).ready(function () {
    $('form').submit(function(event) {
        savePass(event);
    });

    $(":password").keyup(function(){
        if($("#password").val() != $("#matchPassword").val()){
            $("#globalError").show().html(/*[[#{PasswordMatches.user}]]*/);
        }else{
            $("#globalError").html("").hide();
        }
    });

    options = {
            common: {minChar:6},
            ui: {
                showVerdictsInsideProgressBar:true,
                showErrors:true,
                errorMessages:{
                      wordLength: /*[[#{error.wordLength}]]*/,

                    }
                }
        };
     $('#password').pwstrength(options);
});

function savePass(event){
    event.preventDefault();
    $(".alert").html("").hide();
    $(".error-list").html("");
    if($("#password").val() != $("#matchPassword").val()){
        $("#globalError").show().html(/*[[#{PasswordMatches.user}]]*/);
        return;
    }
    var formData= $('form').serialize();
    $.post(serverContext + "user/savePassword",formData ,function(data){
        window.location.href = serverContext + "login?message="+data.message;
    })
    .fail(function(data) {
        if(data.responseJSON.error.indexOf("InternalError") > -1){
            window.location.href = serverContext + "login?message=" + data.responseJSON.message;
        }
        else{
            var errors = $.parseJSON(data.responseJSON.message);
            $.each( errors, function( index,item ){
                $("#globalError").show().html(item.defaultMessage);
            });
            errors = $.parseJSON(data.responseJSON.error);
            $.each( errors, function( index,item ){
                $("#globalError").show().append(item.defaultMessage+"<br/>");
            });
        }
    });
}


    </script>
</div>
</body>

</html>

这将创建 session 并完美更新密码。 但我想发送一个发布请求和一个 newPassword 来存储在数据库中。但无法创建 session 。

Controller.java

@RequestMapping(value = "/user/savePassword", method = RequestMethod.POST)
    @ResponseBody
    public String savePassword(@RequestParam("newPassword") String newPassword) {
        final User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        userService.changeUserPassword(user, newPassword);
        return "Password has been changed successfully. ";
    }

这个

final User user = (User) 
SecurityContextHolder.getContext().getAuthentication().getPrincipal();

当我直接从 UI 应用程序点击 URL 时,不会创建用户 session 。

Please tell me the way to do so.

最佳答案

很难理解到底出了什么问题。如果我理解正确的话,你按照这个例子https://www.baeldung.com/spring-security-registration-i-forgot-my-password是无可挑剔的,那么在检查信件中的 token 时,您应该已经被授权了。

我想,应该在这里

public String validatePasswordResetToken(long id, String token) {
    PasswordResetToken passToken = 
      passwordTokenRepository.findByToken(token);
    if ((passToken == null) || (passToken.getUser()
        .getId() != id)) {
        return "invalidToken";
    }

    Calendar cal = Calendar.getInstance();
    if ((passToken.getExpiryDate()
        .getTime() - cal.getTime()
        .getTime()) <= 0) {
        return "expired";
    }

    User user = passToken.getUser();
    Authentication auth = new UsernamePasswordAuthenticationToken(
      user, null, Arrays.asList(
      new SimpleGrantedAuthority("CHANGE_PASSWORD_PRIVILEGE")));
    SecurityContextHolder.getContext().setAuthentication(auth); // authorization after validation of reset token
    return null;
}

请详细说明您的情况。给我一个完整的例子。或者你只是直接保存密码?

关于java - 使用 Spring Security 注册创建 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60375502/

相关文章:

javascript - 是否可以通过 Ajax 更改页面源内容变量

javascript - Chrome View 与打印预览之间的巨大差异

javascript - Jquery点击功能无法正常工作

jquery - 鼠标在打开的图层上移动

spring - 如何在 Spring 3 结束 session

java - 甲骨文 : Unique constraint violated exception but my data does not actually violate it

java - Google Cloud Endpoint - 如何创建处理程序以从 cron 调用端点

java - activemq 和 Glassfish : InactivityIOException: Channel was inactive for too long

java - 如何在 Spring 中将一些文本添加到所有 Controller URL

spring - 在深度 > 0 的 FindBy Spring 数据 Neo4J 查询中指定方向