UserJwtRealm.java 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package com.fdkankan.common.realm;
  2. import cn.hutool.core.util.StrUtil;
  3. import com.fasterxml.jackson.databind.ObjectMapper;
  4. import com.fdkankan.common.exception.JwtAuthenticationException;
  5. import com.fdkankan.common.jwt.JwtToken;
  6. import com.fdkankan.common.util.JwtUtil;
  7. import org.apache.shiro.authc.AuthenticationException;
  8. import org.apache.shiro.authc.AuthenticationInfo;
  9. import org.apache.shiro.authc.AuthenticationToken;
  10. import org.apache.shiro.authc.SimpleAuthenticationInfo;
  11. import org.apache.shiro.authz.AuthorizationInfo;
  12. import org.apache.shiro.authz.SimpleAuthorizationInfo;
  13. import org.apache.shiro.realm.AuthorizingRealm;
  14. import org.apache.shiro.subject.PrincipalCollection;
  15. import org.slf4j.Logger;
  16. import org.slf4j.LoggerFactory;
  17. import org.springframework.beans.factory.annotation.Autowired;
  18. import org.springframework.stereotype.Component;
  19. @Component
  20. public class UserJwtRealm extends AuthorizingRealm {
  21. private static Logger log = LoggerFactory.getLogger("programLog");
  22. // @Autowired
  23. // private UserFeignClient userService;
  24. @Autowired
  25. private ObjectMapper mapper;
  26. /**
  27. * 必须重写此方法,不然Shiro会报错
  28. */
  29. @Override
  30. public boolean supports(AuthenticationToken token) {
  31. return token instanceof JwtToken;
  32. }
  33. /**
  34. * 只有当需要检测用户权限的时候才会调用此方法,例如checkRole,checkPermission之类的
  35. */
  36. @Override
  37. protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
  38. SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
  39. String username = (String)principals.getPrimaryPrincipal();
  40. // List list = principals.asList();
  41. // Result result = userService.findByUserName(username);
  42. // if (result.getCode() == Result.CODE_FAILURE){
  43. // return authorizationInfo;
  44. // }
  45. // SSOUser dbUser = mapper.convertValue(result.getData(), SSOUser.class);
  46. // authorizationInfo.setRoles(dbUser.getRoleSet());
  47. // authorizationInfo.setStringPermissions(dbUser.getPermissionSet());
  48. return authorizationInfo;
  49. }
  50. /**
  51. * 默认使用此方法进行用户名正确与否验证,错误抛出异常即可。
  52. */
  53. @Override
  54. protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken auth) throws AuthenticationException {
  55. log.info("Step 2: User进行用户名正确与否验证");
  56. String token = (String) auth.getCredentials();
  57. if (StrUtil.isEmpty(token)){
  58. throw new JwtAuthenticationException(3004, "无token,请重新登录");
  59. }
  60. // 解密获得username,用于和数据库进行对比
  61. String username = JwtUtil.getUsername(token);
  62. if (username == null) {
  63. throw new JwtAuthenticationException(3004, "访问异常!");
  64. }
  65. if (!JwtUtil.isVerify(token, username)) {
  66. throw new JwtAuthenticationException(3004, "非法访问!");
  67. }
  68. // TODO: 2021/12/21
  69. // SSOUser ssoUser = SSOLoginHelper.loginCheck(token);
  70. // if (ssoUser == null){
  71. // throw new JwtAuthenticationException(3004, "用户未登录");
  72. // }
  73. //
  74. // // refresh
  75. // TODO: 2021/12/21
  76. // JedisUtil.expire(token, 21600);
  77. return new SimpleAuthenticationInfo(username, token, "jwt_realm");
  78. }
  79. }