目前在一个小项目上使用Spring / Spring安全性,并且难以实现此功能。理想情况下,我只希望user1查看user1的详细信息,而不要查看2,3或4的详细信息。
我已经实现了带有角色的Spring Security,并且了解可以检索UserDetails对象或原则,但不确定,但是我知道我可以使用出现的一种检索当前登录用户的详细信息。有很多方法。
这是我们当前进入管理/主页时用作概念证明的内容:
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
Gamer gamer = gamerService.findGamerByEmail(auth.getName());
System.out.println("Auth: " + auth.getName());
System.out.println("Gamer: " + gamer.getName() + gamer.getId() + gamer.getEmail());
安全配置负责当前用户是否可以由于分配的角色而访问。
我相信我应该能够转到/mysite/viewUserDetails
的网址,并在该页面上显示当前用户的信息,但是我找不到任何示例,我已经找到了很多示例,这些示例可以证明已记录用户中的可以查看页面,但是没有一个页面可以指定检查位置以确保用户1只能查看用户1的详细信息。
在较旧的页面上,我这样做是为了显示特定用户的信息,但我认为这是不正确的做法-
<a th:href="@{/gamer/{gamerid}/games/excited (gamerid=${gamer.id}) }">
*值得一提的是,这并没有使用任何形式的登录/注册来提取此信息,我很简单地使用在数据库查询中传递的ID。
它映射到:
@RequestMapping("/gamer/{gamerid}/games/excited")
public String getExcited(@PathVariable final Long gamerid, Model model){
addGamerListAttributes(model, gamerid, "EXC");
return "games";
}
我的问题就变成了,希望您能指出正确的方向,如何实现一个解决方案,使用户只能查看他/她的详细信息,以及如何通过表单和将控制器作为传递的ID连接来表示网址中的内容有点难看(我可以使用GUID,但是...)
非常感谢。
答案 0 :(得分:1)
看看@PreAuthorize
注释。可以用它注释给定的端点并在bean中创建自定义逻辑。然后,您可以使用自定义方法来允许或不允许端点继续:
@Controller
public class HomeController {
@Autowired
private AuthenticationService authenticationService;
@RequestMapping("/gamer/{gamerid}/games/excited")
@PreAuthorize("@authenticationService.hasAccess(#gamerid)")
public String getExcited(@PathVariable final Long gamerid, Model model){
addGamerListAttributes(model, gamerid, "EXC");
return "games";
}
}
服务类别:
@Service
public class AuthenticationService {
public boolean hasAccess(String tgamerid) {
//implement logic here
return true;
}
}
hasAccess
中的方法AuthenticationService
应该返回布尔值。 @PreAuthorize
将在调用控制器处理程序方法之前启动。上面的控制器只是一个例子。您可以将Authentication
注释中SPeL表达式中的@PreAuthorize
对象传递给服务方法,或者从服务类内部的安全上下文中获取它,以实现适合您需求的逻辑。可以在here和Spring Docs中找到更多信息。
答案 1 :(得分:1)
这实际上是一个简单的选择。您有一个像这样的入口点:
@RequestMapping("/gamer/{gamerid}/games/excited")
,然后您手动检查会话中的用户是否可以访问请求的资源,或者您有类似的东西
@RequestMapping("/my-games")
可从安全上下文中自动读取用户ID。
除了安全性选择外,我还会根据代码重用和将来的用例(例如,一个以上的用户可以看到相同的页面/一组页面)来选择一个。