輕量級Web框架應用_第六週

回顧

上週我們主要做了兩個事情:

  1. 利用shiro的認證器實現了一個登錄接口
  2. 利用shiro的授權器實現了接口的訪問限制

接口: 添加用戶

還記得我們的addUser接口嗎?

    @ApiImplicitParams({
           @ApiImplicitParam(name = "token", value = "鑑權用戶",required = true,paramType = "header")
   })
   @GetMapping("/addUser")
   @RequiresRoles(value = {"admin","manager"},logical = Logical.OR)
   public ResultJson addUser(){
       return new ResultJson("200","成功",null);
   }

當時我們只是爲了測試shiro對接口的權限管理, 僅僅只是簡單的返回了個成功的信息而已, 並沒有實際上的操作, 接下來我們就來完善這個接口吧!

實現步驟現在應該要很清晰了, 如果忘了可以看下圖

mapper.java
mapper.xml
service
controller

一般來說, 在添加一個新用戶的同時, 應該將用戶的角色同時分配好, 那麼參數應該有三個: (用戶名, 密碼, 角色名);
也就是說, 我們會涉及到三張表: 用戶表, 用戶角色表, 角色表
實現思路:

  1. 通過角色名在角色表中取得角色ID
  2. 在用戶表中插入數據
  3. 通過用戶名稱來取得新增的用戶ID
  4. 在用戶角色表中插入用戶對應的角色

UserRoleInfoMapper.java中新增一個根據角色名取得角色ID的方法

public interface RoleInfoMapper {
    int insert(RoleInfo record);
	//根據角色名取得角色ID
    int findRoleIDByRoleName(@Param("roleName") String roleName);
    
}

接着來到UserRoleInfoMapper.xml中添加對應的SQL語句

<select id="findRoleIDByRoleName" resultType="INTEGER">
    SELECT role_id
    FROM role_info
    WHERE role_name=#{roleName,jdbcType=VARCHAR}
    LIMIT 1
 </select>

這樣我們查詢角色ID的mappper就搞定了
然後我們來做第二步: 插入用戶信息
插入用戶信息的功能其實我們已經在測試類裏寫過一個testInsert
這段代碼只要複製過來做個小小的改動就能用了! 這裏就不贅述了
如果你還記得shiro的認證器的話, 其實通過用戶名稱來取得用戶ID的mapper我們也有了:在UserInfoMapper中的findFirstByUserName
再看UserRoleMapperinsert方法, 用戶角色表的插入mapper也寫好了
那麼只剩下service層的操作了, 無比簡單
UserService中新增一個addUser的方法

public interface UserService {

    UserInfo getUserInfo(String userName);

    Set<String> getUserRoles(Integer userID);

    Set<String> getUserPermissions(Integer userID);

    void addUser(String userName,String password,String roleName);

}

UserServiceImpl中去實現它

    @Override
    public void addUser(String userName, String password, String roleName) throws Exception {
        //根據角色名稱獲取角色ID
        int roleID = roleInfoMapper.findRoleIDByRoleName(roleName);
        //插入用戶記錄
        UserInfo userInfo = new UserInfo();
        userInfo.setUserName(userName);
        String salt = UUID.randomUUID().toString().replace("-","");
        userInfo.setSalt(salt);
        SimpleHash simpleHash = new SimpleHash(Md5Hash.ALGORITHM_NAME,password,salt,512);
        userInfo.setPassword(simpleHash.toString());
        userInfo.setCreateTime(new Date());
        userInfo.setUserState(Byte.parseByte("0"));
        userInfoMapper.insert(userInfo);
        //插入用戶記錄完成後根據用戶名稱獲取用戶ID
        UserInfo userInfoResult = userInfoMapper.findFirstByUserName(userName);
        //插入用戶角色信息
        UserRole userRole = new UserRole();
        userRole.setRoleId(roleID);
        userRole.setUserId(userInfoResult.getUserId());
        userRoleMapper.insert(userRole);
    }

最後來到UserController完善添加用戶的接口

  @PostMapping("/addUser")
  @RequiresRoles(value = {"admin","manager"},logical = Logical.OR)
      public ResultJson addUser(String userName,String password,String roleName){
          try {
              userService.addUser(userName,password,roleName);
              return new ResultJson("200","成功",null);
          }catch (Exception e){
              return new ResultJson("400","失敗",e.toString());
          }
  }

接口: 刪除用戶

做了這麼多遍了, 這個已經是無比簡單了! ! ! 這裏我很想寫一個
不過還是來簡單分析下吧. 後端接收到用戶名, 通過用戶名來刪除用戶信息;
那麼試想下, 如果我現在直接去刪除用戶表的用戶記錄的話, 應該是刪除不掉的, 因爲在用戶角色表中, 有我們的用戶角色記錄; 也就是說, 在刪除用戶信息之前, 應該先把用戶角色的記錄給刪除掉
實現思路:

  1. 通過用戶名來取得用戶ID
  2. 通過用戶ID來刪除用戶角色表中的對應信息
  3. 通過用戶ID來刪除用戶表中的對應信息

對應到實際操作:

  1. 利用在UserInfoMapper中的findFirstByUserName取得用戶ID
  2. UserRoleMapper中編寫刪除的方法和與其對應的SQL語句
  3. UserService層中編寫對應的刪除方法, 並在UserServiceImpl中實現它
  4. 最後在UserController中編寫接口

自己試着寫一下吧, 這裏我就不貼上源碼了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章