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

使用Spring Security实现UserDetail和UserDetailService的自定义用户、角色和权限

郤玉书
2023-03-14

我希望使用Spring Security(使用MySql)存储用户、角色、权限(权限)。我做了以下工作:

ApplicationUser(id,firstName,lastName,username,password,roles)
ApplicationRole(id,name,description,permissions)实现GrantedAuthority
ApplicationPermission(id,name,description)实现GrantedAuthority

我创建了一个实现UserDetailService的类。在loadUserByUsername方法中,我执行以下操作:

ApplicationUser applicationUser = userRepository.findByUsername(username);
if(applicationUser == null) {
    throw new UsernameNotFoundException(username);
}

// Extract role/role permission grantedAuthorities from db user
List<GrantedAuthority> grantedAuthorities = new ArrayList<>();
for (Role role: applicationUser.getRoles()) {
    grantedAuthorities.add(role);
    grantedAuthorities.addAll(role.getPermissions());
}

return new User(applicationUser.getUsername(), applicationUser.getPassword(), grantedAuthorities);

然而,这仍然让我有点困惑,这里是我的几个问题。

  1. 是否需要在我的ApplicationRole和ApplicationPermission类上实现GrantedAuthority。在我见过的许多例子中,我没有看到其他人这样做,但它似乎使我的生活变得更容易,所以我可以得到它们并按原样传递它们。
  2. 我没有用我的ApplicationUser类实现UserDetails。如果我这样做,目的是什么?唯一的原因是我可以自定义getAuthorities、isAccountNonExpired、isAccountNonLocked、isCredentialsNonExpired和isEnabled方法吗?是否有这些方法的默认实现,或者只有在我创建我的版本时。如果我已经在UserDetailsServiceImpl中使用loadbyUserName实现了getAuthorities,为什么还需要在这里实现它?
  3. SimpleGrantedAuthority的目的是什么?我看到它实现了GrantedAuthority,并且只接受一个字符串名称。但是,由于我使用ApplicationRole和ApplicationPermission类实现了GrantedAuthority,所以我觉得不需要使用它。

我认为我的问题是,我不知道何时/如何正确实现UserDetailService和UserDetailService以确保我从数据库加载权限,并在每次用户登录时设置这些权限。另外,用我的ApplicationRole和ApplicationPermission类实现GrantedAuthority有什么意义吗?

共有1个答案

亢建白
2023-03-14

>

  • 没有必要,我也不推荐。将应用程序的这些不同方面分开是很好的。据我所知,在自定义UserDetailsService中获取角色并将其文本表示形式包装在SimpleGrantedAuthority(即它们的名称)中是一种常见的做法。请注意,要在Spring Security中区分角色和权限,您必须在默认情况下为角色加上role_标记(请参见HasRoleHasAuthority访问控制表达式)。

    拥有自定义的userdetails实现并不是必需的,但可能有好处,例如,您可以存储特定于应用程序的额外字段。默认实现是org.springframework.security.core.userdetails.user,大多数时候您可以扩展这个实现。

    参见#1

    用我的ApplicationRole和ApplicationPermission类实现GrantedAuthority有什么意义吗?

    不会有任何意义的,不。现有的实现涵盖了许多用例,但对于最简单的用例,您可以只使用simplegrantedauthority

  •  类似资料:
    • Defining and using roles(定义和使用 角色) 静态角色 动态角色 Loopback 允许使用定义 静态 和 动态角色 区别: 静态角色被存储在一个数据源中,同时映射到用户上 没有确定在哪里赋予用户角色 Static roles 下面代码段,展示如何 定义一个新的静态角色 并 分配用户给该角色 // 创建用户 User.create([ {username: 'Joh

    • 我已经基于命名的路由为Laravel(4.2)创建了自定义角色管理器,例如: 基本上,任何注册为

    • 我是新来的。我有一个问题。我有3个子组织(org A、B和C),每个组织都有每个单独的用户。例如UA1、UB2、UC3。 现在我想定制文档和媒体portlet的权限,以便UA1可以上传/下载他的文档。但组织A中的另一个用户(例如UA4)无法访问UA1的文档。同时,用户UB2和UC3可以查看用户UA1的文档或为其添加新文档。 我可以通过创建角色和权限来实现这一点吗?我尝试了许多组合,但都不起作用。

    • 我试图在一个带有spring security和KeyClope的java应用程序中同时使用领域和资源角色。不幸的是,KeyClope只会返回一个或另一个,具体取决于: 您仍然可以通过自定义代码获得这两种方法,但它会弄乱@PreAuthorize或spring boot方法等注释。isUserInRole,这会导致难看的代码。 有没有办法覆盖@PreAuthorize方法或JSON令牌Keyclo

    • 本文向大家介绍Springboot+SpringSecurity+JWT实现用户登录和权限认证示例,包括了Springboot+SpringSecurity+JWT实现用户登录和权限认证示例的使用技巧和注意事项,需要的朋友参考一下 如今,互联网项目对于安全的要求越来越严格,这就是对后端开发提出了更多的要求,目前比较成熟的几种大家比较熟悉的模式,像RBAC 基于角色权限的验证,shiro框架专门用于

    • 问题内容: 在将旧版应用程序迁移到Spring Security时,出现以下异常: 在旧的应用程序中,角色有“超级管理员”,“编辑者”,“帮助台”等。但是在所有Spring Security示例中,我仅看到诸如“ ROLE _”(“ ROLE_ADMIN”等)的角色。当我将“ superadmin”重命名为“ ROLE_ADMIN”并且仅在配置中使用此角色时,一切正常。 不起作用: 作品: 可以使