确保特定用户只能看到他们自己的用户详细信息-使用Spring

时间:2019-04-28 17:58:46

标签: java spring spring-boot spring-mvc spring-security

目前在一个小项目上使用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,但是...)

非常感谢。

2 个答案:

答案 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对象传递给服务方法,或者从服务类内部的安全上下文中获取它,以实现适合您需求的逻辑。可以在hereSpring Docs中找到更多信息。

答案 1 :(得分:1)

这实际上是一个简单的选择。您有一个像这样的入口点:

@RequestMapping("/gamer/{gamerid}/games/excited")

,然后您手动检查会话中的用户是否可以访问请求的资源,或者您有类似的东西

@RequestMapping("/my-games")

可从安全上下文中自动读取用户ID。

除了安全性选择外,我还会根据代码重用和将来的用例(例如,一个以上的用户可以看到相同的页面/一组页面)来选择一个。