Shiro

Security - 图1
实际进行权限信息验证的是我们的 Realm,Shiro 框架内部默认实现外,就是自定义Realm,重写doGetAuthorizationInfodoGetAuthenticationInfo
根据从主体传过来的用户名,从数据源取password, roles, permissions进行比对。

  1. public class MyRealm extends AuthorizingRealm {
  2. @Override
  3. protected AuthorizationInfo doGetAuthorizationInfo(
  4. PrincipalCollection principalCollection) {
  5. // 1.从主体传过来的认证信息中,获得用户名
  6. String userName = (String) principalCollection.getPrimaryPrincipal();
  7. // 2.从数据库获取角色和权限数据
  8. Set<String> roles = getRolesByUserName(userName);
  9. Set<String> permissions = getPermissionsByUserName(userName);
  10. SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
  11. simpleAuthorizationInfo.setStringPermissions(permissions);
  12. simpleAuthorizationInfo.setRoles(roles);
  13. return simpleAuthorizationInfo;
  14. }
  15. @Override
  16. protected AuthenticationInfo doGetAuthenticationInfo(
  17. AuthenticationToken authenticationToken) throws AuthenticationException {
  18. // 1.从主体传过来的认证信息中,获得用户名
  19. String userName = (String) authenticationToken.getPrincipal();
  20. // 2.通过用户名到数据库中获取凭证
  21. String password = getPasswordByUserName(userName);
  22. if (password == null) {
  23. return null;
  24. }
  25. SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(
  26. userName, password, "myRealm"
  27. );
  28. return authenticationInfo;
  29. }
  30. }
  1. public class MyRealmTest {
  2. @Test
  3. public void loginTest() {
  4. MyRealm myRealm = new MyRealm(); // 实现自己的 Realm 实例
  5. // 1.构建SecurityManager环境
  6. DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
  7. defaultSecurityManager.setRealm(myRealm);
  8. // 2.主体提交认证请求
  9. SecurityUtils.setSecurityManager(defaultSecurityManager);
  10. Subject subject = SecurityUtils.getSubject();
  11. UsernamePasswordToken token = new UsernamePasswordToken("yanjing", "123456");
  12. subject.login(token); // 登录
  13. // subject.isAuthenticated()方法返回一个boolean值,用于判断用户是否认证成功
  14. System.out.println("isAuthenticated:" + subject.isAuthenticated()); // 输出true
  15. // 判断subject是否具有admin和user两个角色权限,如没有则会报错
  16. subject.checkRoles("admin", "user");
  17. subject.checkRole("admin");
  18. // 判断subject是否具有user:add和user:delete权限
  19. subject.checkPermissions("user:delete", "user:add");
  20. subject.checkPermissions("user:delete");
  21. }
  22. }

image.png

加密解密

MD5, sha256, sha512, 加盐,增加Hash迭代次数

  1. public class EncryptUtil {
  2. public static void main(String[] args) {
  3. encrypt("123");
  4. }
  5. public static String encrypt(String password) {
  6. String salt = new SecureRandomNumberGenerator().nextBytes().toString();
  7. int times = 2;
  8. String alogrithm = "md5"; // 加密算法
  9. String encryptedPassword = new SimpleHash(alogrithm, password, salt, times).toString();
  10. System.out.printf("原始密码是 %s , 盐是: %s, 运算次数是: %d, 运算出来的密文是:%s ",
  11. password, salt, times, encryptedPassword);
  12. return encryptedPassword;
  13. }
  14. }

cryptojs 配合后端 前端vue使用crypto.js加密Java后端解密
java.net.URLDecoder