【简介】: 权限管理一般指的是系统设置的安全规则或安全策略,用户可以访问而且只能访问自己被授权的资源。在权限管理中使用最多的还是基于角色访问控制。
【基于角色访问控制图】:
在这里插入代码片
#用户的身份、凭据
[users]
admin=admin
apple=ad123
@Testpublic void testLoginByIni() {// 1、创建安全管理器DefaultSecurityManager securityManager = new DefaultSecurityManager();// 2、创建IniRealm对象IniRealm iniRealm = new IniRealm("classpath:shiro/shiro-authc.ini");// 3、将realm设置到安全管理器中securityManager.setRealm(iniRealm);// 4、将安全管理器设置到上下文环境中SecurityUtils.setSecurityManager(securityManager);// 5、获取主体对象Subject subject = SecurityUtils.getSubject();// 6、创建令牌UsernamePasswordToken token = new UsernamePasswordToken("admin", "admin");// 7、进行登录认证subject.login(token);// 8、判断是否登录System.out.println("当前用户是否登录= " + subject.isAuthenticated());}
【错误解析】:
@Data
@AllArgsConstructor
public class User {private String username;private String password;
}
public class UserMapper {private static Map users = new HashMap<>();static {User user0 = new User("admin", "admin");User user1 = new User("admin123", "admin123");users.put(user0.getUsername(), user0);users.put(user1.getUsername(), user1);}/*** 根据用户名返回user对象** @param username 用户名* @return user*/public static User getUserByUserName(String username) {return users.get(username);}
}
public class UserRealm extends AuthorizingRealm {// 授权@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {return null;}// 认证@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {/*** 获取用户传递的数据*/UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token;// 获取用户传递的用户名String username = usernamePasswordToken.getUsername();// 根据用户名获取对象User user = UserMapper.getUserByUserName(username);// 判断是否为空if (user == null) {return null;}// 不为空交给认证管理器进行认证/*** 参数1:存放user对象* 参数2:用户密码* 参数3:realm名称*/return new SimpleAuthenticationInfo(user, user.getPassword(), getName());}
}
@Testpublic void testShiroRoleByRealm() {DefaultSecurityManager securityManager=new DefaultSecurityManager();UserRealm userRealm=new UserRealm();securityManager.setRealm(userRealm);SecurityUtils.setSecurityManager(securityManager);Subject subject = SecurityUtils.getSubject();UsernamePasswordToken token = new UsernamePasswordToken("admin", "admin");subject.login(token);System.out.println("当前用户是否登录= " + subject.isAuthenticated());}
#用户的身份、凭据、角色
[users]
admin=admin,hr,seller
apple=ad123,seller
#角色与权限信息
[roles]
hr=user:list,user:delete
seller=customer:list,customer:save
@Testpublic void testAuthorByIni() {DefaultSecurityManager securityManager = new DefaultSecurityManager();IniRealm iniRealm = new IniRealm("classpath:shiro/shiro-author.ini");securityManager.setRealm(iniRealm);SecurityUtils.setSecurityManager(securityManager);Subject subject = SecurityUtils.getSubject();UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken("admin", "admin");subject.login(usernamePasswordToken);// 登录成功之后开始判断是否拥有某个权限System.out.println("当前用户是否拥有用户列表权限 = " + subject.isPermitted("user:list"));System.out.println("当前用户是否拥有这两个权限中的一个 = " + Arrays.toString(subject.isPermitted("user:list", "user:delete")));}
@Data
@AllArgsConstructor
public class User {private String username;private String password;
}
public class UserMapper {private static Map users = new HashMap<>();//角色集合private static Map> roleData = new HashMap>();//权限集合private static Map> permissionData = new HashMap>();static {User user0 = new User("admin", "admin");User user1 = new User("admin123", "admin123");users.put(user0.getUsername(), user0);roleData.put(user0.getUsername(), Arrays.asList("seller"));permissionData.put(user0.getUsername(),Arrays.asList("customer:list", "customer:save"));users.put(user1.getUsername(), user1);roleData.put(user1.getUsername(), Arrays.asList("seller", "hr"));permissionData.put(user1.getUsername(),Arrays.asList("customer:list", "customer:save", "user:list", "user:delete"));}/*** 根据用户名返回user对象** @param username 用户名* @return user*/public static User getUserByUserName(String username) {return users.get(username);}public static List getRoleByName(String username){return roleData.get(username);}public static List getPermissionByName(String username){return permissionData.get(username);}
}
public class UserRealm extends AuthorizingRealm {// 授权@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {// 获取当前上下文环境中的用户信息User user = (User) principals.getPrimaryPrincipal();String username = user.getUsername();// 获取权限列表List permissionList = UserMapper.getPermissionByName(username);// 获取角色列表List roleList = UserMapper.getRoleByName(username);// 封装info对象信息SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();info.addStringPermissions(permissionList);info.addRoles(roleList);return info;}// 认证@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {/*** 获取用户传递的数据*/UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token;// 获取用户传递的用户名String username = usernamePasswordToken.getUsername();// 根据用户名获取对象User user = UserMapper.getUserByUserName(username);// 判断是否为空if (user == null) {return null;}// 不为空交给认证管理器进行认证/*** 参数1:存放user对象* 参数2:用户密码* 参数3:realm名称*/return new SimpleAuthenticationInfo(user, user.getPassword(), getName());}
}
@Testpublic void testAuthorByRealm(){DefaultSecurityManager securityManager = new DefaultSecurityManager();UserRealm userRealm=new UserRealm();securityManager.setRealm(userRealm);SecurityUtils.setSecurityManager(securityManager);Subject subject = SecurityUtils.getSubject();UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken("admin", "admin");subject.login(usernamePasswordToken);// 登录成功之后开始判断是否拥有某个权限System.out.println("当前用户是否拥有用户列表权限 = " + subject.isPermitted("user:list"));System.out.println("当前用户是否拥有这两个权限中的一个 = " + Arrays.toString(subject.isPermitted("user:list", "user:delete")));}
@Testpublic void testMD5() {Md5Hash md5Hash = new Md5Hash("123456");System.out.println(md5Hash.toString());}
@Testpublic void testMD5() {Md5Hash md5Hash = new Md5Hash("123456","abcd412e");System.out.println(md5Hash.toString());}
上一篇:重放攻击与防护
下一篇:jQuery《一篇搞定》