gpt4 book ai didi

java - 如何在 Spring Security 中强制重新验证凭据?

转载 作者:搜寻专家 更新时间:2023-11-01 02:25:35 25 4
gpt4 key购买 nike

我想在允许在我的网络应用程序中执行特别敏感的操作之前强制重新验证凭据,例如向一组数据添加签名。

场景是用户已经登录,单击以在数据上添加他们的签名,并获得用于输入其凭据的字段,然后传递给服务器进行身份验证。失败不会影响登录状态,只是拒绝该操作。

我正在使用 Grails spring-security 插件并针对 LDAP (spring-security-ldap) 进行身份验证,但我假设解决方案将独立于这些确切的细节。

我在服务器端( Controller /servlet)有用户名和密码值,我如何验证这些新凭据?

最佳答案

您可以在 Controller 中重用您的用户凭据和 Spring Security 基础结构,而无需操作当前身份验证。基本上,您的应用程序通过一个简单的表单用户名和密码进行请求,并使用 authenticationManager 对其进行验证。根据结果​​,您可以继续您的应用程序逻辑或执行其他操作。

此示例展示了 authenticationManagerSpring MVC Controller 中的用法。不幸的是,我不是 Grails 用户。给你一个有效的例子,这个例子是使用 Java 和 Spring MVC。为简洁起见,省略了 JSP。

可以找到一个完整的例子here (在批准页面下)。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import java.util.Map;

@Controller
@RequestMapping("approval")
public class ApprovalController {

@Autowired
private AuthenticationManager authenticationManager;

@RequestMapping(value="confirm.do", method = RequestMethod.GET)
public String get() {
return "approval/confirm";
}

@RequestMapping(value="confirm.do", method = RequestMethod.POST)
public String post(@ModelAttribute ApprovalRequestForm form, Map<String, Object> model, Authentication authentication) {
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(form.getUsername(), form.getPassword());
Authentication authenticate = authenticationManager.authenticate(token);

if(authenticate.isAuthenticated() && isCurrentUser(authentication, authenticate)) {
//do your business
return "approval/success";
}

model.put("reason", "credentials doesn't belong to current user");
return "approval/denied";
}

private boolean isCurrentUser(Authentication left, Authentication right) {
return left.getPrincipal().equals(right.getPrincipal());
}

@ExceptionHandler(Exception.class)
public ModelAndView handleException(Exception exception) {
ModelAndView model = new ModelAndView("approval/denied");
model.addObject("reason", exception.getMessage());
return model;
}

public static class ApprovalRequestForm {
private String username;
private String password;

public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }
public String getPassword() { return password; }
public void setPassword(String password) { this.password = password; }
}
}

关于java - 如何在 Spring Security 中强制重新验证凭据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24253599/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com