如何编写一个select查询来返回一行中基于布尔值的多个结果(对于spring security authorities查询)?

iibxawm4  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(278)

我有一个使用springsecurity5的javaweb应用程序。
我使用mysql作为数据库。
包含用户的数据库表如下所示:

USERS TABLE
ID | USERNAME | PASSWORD | ADMIN_ROLE | USER_ROLE | READONLY_ROLE
-----------------------------------------------------------------
1  | Andy     | abc123   | 1          | 1         | 0
2  | Bob      | xyz789   | 0          | 1         | 1
3  | Chuck    | qrs567   | 1          | 0         | 1

spring security要求我给它两个查询。。。一个获取用户,一个获取用户角色。
通常查询如下所示:

users-by-username-query="SELECT USERNAME, PASSWORD FROM USERS WHERE USERNAME=?;"

authorities-by-username-query="SELECT USERNAME, ROLENAME FROM TBL_USER_ROLE WHERE USERNAME=?;"

但是,我的用户和角色在一个表中。
那么,对于我的“authorities”查询,有没有一种方法可以在users表(上面)上编写一个sql查询,为每个“role”值1(true)提供一个记录?结果如下:

USERNAME | ROLE_NAME
---------------
Andy     | ADMIN_ROLE
Andy     | USER_ROLE
Bob      | USER_ROLE
Bob      | READONLY_ROLE
Chuck    | ADMIN_ROLE
Chuck    | READONLY_ROLE
hc8w905p

hc8w905p1#

Select main.ID,
       main.USERNAME, 
CASE WHEN main.ADMIN_ROLE = 1 
     THEN 'ADMIN_ROLE'
     ELSE NULL END AS ROLE
FROM users main
WHERE ADMIN_ROLE = 1
UNION
SELECT u.ID,
       u.USERNAME,
      CASE WHEN u.user_role = 1 
        THEN 'USER_ROLE'
        ELSE NULL END AS ROLE
FROM USERS u
WHERE USER_ROLE = 1
UNION
SELECT r.ID,
       r.USERNAME,
     CASE WHEN r.READONLY_ROLE = 1 
          THEN 'READONLY_ROLE'
          ELSE NULL END AS ROLE
FROM users r
WHERE READONLY_ROLE = 1

ID  USERNAME    ROLE
 1  Andy      ADMIN_ROLE
 1  Andy      USER_ROLE
 2  Bob       READONLY_ROLE
 2  Bob       USER_ROLE
 3  Chuck     ADMIN_ROLE
 3  Chuck     READONLY_ROLE

相关问题