技术背景
在Java应用程序中,权限控制是一个重要的安全机制,它可以限制用户对系统资源的访问权限,从而保护系统数据的安全。
功能需求
我们希望设计一个Java权限控制系统,该系统能够满足以下功能需求:
- 能够定义权限并将其分配给用户和角色。
- 能够控制用户和角色对系统资源的访问权限。
- 能够对用户和角色进行管理,包括创建、修改和删除。
- 能够实现灵活的权限控制策略
技术实现
该类是一个接口,用于定义业务对象的公共方法和属性。
package com.qcmb.java.auth.entity;
/**
* 业务对象
*/
public interface Bo {}
该类是一个实体类,用于表示权限。它包含一个属性url,表示资源的位置(唯一)。
package com.qcmb.java.auth.entity;
import com.qcmb.java.auth.SecuritySingleton;
import com.qcmb.java.auth.security.PermissionSecurity;
import com.qcmb.java.auth.security.Security;
import java.util.regex.Pattern;
/**
* 权限实体
*/
public class Permission implements Bo{
/**
* 资源位置(唯一)
*/
private String url;
public String getUrl() {
return this.url;
}
/**
* 这个正则表达式可以匹配以下URL:
* www.google.com
* aa.bb.com/a1/b2
* aa.bb.com/a1/b2?q=java
* aa.bb.com/a1/b2#section1
* 它不能匹配以下URL:
* http://www.google.com
* www.example.com/index.html
* example.com:8080
*/
//这个正则表达式不能匹配包含协议头的 URL。
private static final String regex = "^[a-zA-Z0-9\\-\\.]+\\.[a-zA-Z]{2,6}(/[a-zA-Z0-9\\-\\.]+)*$";
public Permission(String url){
//检查输入的 URL 是否有效
//这个正则表达式只能匹配简单的 URL。它不能匹配包含特殊字符或空格的 URL。
if (!Pattern.matches(regex, url)) {
// 处理无效的 URL
this.url = null;
}else {
this.url = url;
}
}
public Permission(String url,PermissionSecurity permissionSecurity){
this(url);
//注册到集合里,以便在其它地方也可以使用。
SecuritySingleton.reg(permissionSecurity);
//一些简单的安全措施
Security permissionSecurityInstance = SecuritySingleton.getInstance(permissionSecurity.getClass());
boolean b = permissionSecurityInstance.isSecurity(this);
if (!b){
this.url = null;
}
}
}
该类是一个实体类,用于表示角色。它包含一个属性id,表示角色的唯一标识。它还包含一个属性permissions,表示角色对应的权限集合。
package com.qcmb.java.auth.entity;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
/**
* 角色实体
*/
public class Role implements Bo {
/**
* 角色唯一标识
*/
protected String id;
public String getId() {
return id;
}
/**
* 角色对应的权限集合,一个角色可以有多个权限
*/
protected final Map<String,Permission> permissions = new ConcurrentHashMap<>();
/**
* 某个url和Permission对象的映射
*/
public Permission getPermissionByUrl(String url){
return permissions.get(url);
}
/**
* 可通过当前角色得到该角色的所有权限
*/
public List<Permission> getPermissions(){
Collection<Permission> values = permissions.values();
if (values.isEmpty()){
return null;
}else {
return new ArrayList<>(values);
}
}
/**
* 添加或者更改权限,可通过此方法给用户分配权限
*/
public void addPermiss