1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
| /**
* 抽象主题 - 用户服务接口
*/
public interface UserService {
String getUserInfo(String userId);
boolean updateUserInfo(String userId, String newInfo);
boolean deleteUser(String userId);
List<String> getAllUsers();
}
/**
* 用户信息类
*/
public class User {
private String userId;
private String name;
private String email;
private String role;
public User(String userId, String name, String email, String role) {
this.userId = userId;
this.name = name;
this.email = email;
this.role = role;
}
@Override
public String toString() {
return "User{" +
"userId='" + userId + "'" +
", name='" + name + "'" +
", email='" + email + "'" +
", role='" + role + "'" +
'}';
}
// getter和setter方法
public String getUserId() { return userId; }
public String getName() { return name; }
public String getEmail() { return email; }
public String getRole() { return role; }
public void setName(String name) { this.name = name; }
public void setEmail(String email) { this.email = email; }
}
/**
* 真实主题 - 用户服务实现
*/
public class UserServiceImpl implements UserService {
private Map<String, User> users;
public UserServiceImpl() {
this.users = new HashMap<>();
initializeUsers();
}
private void initializeUsers() {
users.put("admin001", new User("admin001", "管理员", "admin@company.com", "ADMIN"));
users.put("user001", new User("user001", "张三", "zhangsan@company.com", "USER"));
users.put("user002", new User("user002", "李四", "lisi@company.com", "USER"));
users.put("manager001", new User("manager001", "王经理", "manager@company.com", "MANAGER"));
}
@Override
public String getUserInfo(String userId) {
System.out.println("💾 从数据库查询用户信息: " + userId);
User user = users.get(userId);
return user != null ? user.toString() : "用户不存在";
}
@Override
public boolean updateUserInfo(String userId, String newInfo) {
System.out.println("✏️ 更新用户信息: " + userId + " -> " + newInfo);
User user = users.get(userId);
if (user != null) {
// 简化:这里只是演示,实际会解析newInfo并更新具体字段
System.out.println("数据库更新成功");
return true;
}
return false;
}
@Override
public boolean deleteUser(String userId) {
System.out.println("🗑️ 从数据库删除用户: " + userId);
User removedUser = users.remove(userId);
if (removedUser != null) {
System.out.println("用户删除成功: " + removedUser.getName());
return true;
}
return false;
}
@Override
public List<String> getAllUsers() {
System.out.println("📋 查询所有用户列表");
return users.values().stream()
.map(User::toString)
.collect(Collectors.toList());
}
}
/**
* 当前用户会话
*/
public class UserSession {
private String currentUserId;
private String currentUserRole;
public UserSession(String userId, String role) {
this.currentUserId = userId;
this.currentUserRole = role;
}
public String getCurrentUserId() { return currentUserId; }
public String getCurrentUserRole() { return currentUserRole; }
public boolean isAdmin() { return "ADMIN".equals(currentUserRole); }
public boolean isManager() { return "MANAGER".equals(currentUserRole); }
public boolean isUser() { return "USER".equals(currentUserRole); }
@Override
public String toString() {
return "UserSession{userId='" + currentUserId + "', role='" + currentUserRole + "'}";
}
}
/**
* 保护代理 - 用户服务权限代理
*/
public class UserServiceProtectionProxy implements UserService {
private UserServiceImpl realUserService;
private UserSession currentSession;
public UserServiceProtectionProxy(UserSession session) {
this.currentSession = session;
this.realUserService = new UserServiceImpl();
}
@Override
public String getUserInfo(String userId) {
System.out.println("🔒 权限检查 - 查询用户信息");
// 权限检查:用户只能查询自己的信息,管理员和经理可以查询任何人
if (currentSession.isAdmin() || currentSession.isManager()) {
System.out.println("✅ 管理员/经理权限:允许查询任何用户信息");
return realUserService.getUserInfo(userId);
} else if (currentSession.getCurrentUserId().equals(userId)) {
System.out.println("✅ 用户权限:允许查询自己的信息");
return realUserService.getUserInfo(userId);
} else {
System.out.println("❌ 权限不足:普通用户只能查询自己的信息");
return "权限不足:无法查询其他用户信息";
}
}
@Override
public boolean updateUserInfo(String userId, String newInfo) {
System.out.println("🔒 权限检查 - 更新用户信息");
// 权限检查:用户只能更新自己的信息,管理员可以更新任何人
if (currentSession.isAdmin()) {
System.out.println("✅ 管理员权限:允许更新任何用户信息");
return realUserService.updateUserInfo(userId, newInfo);
} else if (currentSession.getCurrentUserId().equals(userId)) {
System.out.println("✅ 用户权限:允许更新自己的信息");
return realUserService.updateUserInfo(userId, newInfo);
} else {
System.out.println("❌ 权限不足:只能更新自己的信息");
return false;
}
}
@Override
public boolean deleteUser(String userId) {
System.out.println("🔒 权限检查 - 删除用户");
// 权限检查:只有管理员可以删除用户
if (currentSession.isAdmin()) {
System.out.println("✅ 管理员权限:允许删除用户");
return realUserService.deleteUser(userId);
} else {
System.out.println("❌ 权限不足:只有管理员可以删除用户");
return false;
}
}
@Override
public List<String> getAllUsers() {
System.out.println("🔒 权限检查 - 查询所有用户");
// 权限检查:只有管理员和经理可以查看所有用户
if (currentSession.isAdmin() || currentSession.isManager()) {
System.out.println("✅ 管理员/经理权限:允许查看所有用户");
return realUserService.getAllUsers();
} else {
System.out.println("❌ 权限不足:只有管理员和经理可以查看所有用户");
return Arrays.asList("权限不足:无法查看用户列表");
}
}
public void changeSession(UserSession newSession) {
this.currentSession = newSession;
System.out.println("🔄 会话切换: " + newSession);
}
}
// 保护代理演示
public class ProtectionProxyDemo {
public static void main(String[] args) {
System.out.println("=== 保护代理模式演示 ===");
System.out.println("\n=== 1. 普通用户登录 ===");
UserSession userSession = new UserSession("user001", "USER");
UserService userService = new UserServiceProtectionProxy(userSession);
System.out.println("当前用户: " + userSession);
// 普通用户操作测试
System.out.println("\n--- 普通用户操作测试 ---");
System.out.println("1. 查询自己的信息:");
String result1 = userService.getUserInfo("user001");
System.out.println("结果: " + result1);
System.out.println("\n2. 查询其他用户信息:");
String result2 = userService.getUserInfo("user002");
System.out.println("结果: " + result2);
System.out.println("\n3. 更新自己的信息:");
boolean result3 = userService.updateUserInfo("user001", "新邮箱: new@email.com");
System.out.println("结果: " + (result3 ? "成功" : "失败"));
System.out.println("\n4. 尝试删除用户:");
boolean result4 = userService.deleteUser("user002");
System.out.println("结果: " + (result4 ? "成功" : "失败"));
System.out.println("\n5. 查看所有用户:");
List<String> result5 = userService.getAllUsers();
result5.forEach(System.out::println);
System.out.println("\n=== 2. 经理登录 ===");
UserSession managerSession = new UserSession("manager001", "MANAGER");
UserServiceProtectionProxy proxy = (UserServiceProtectionProxy) userService;
proxy.changeSession(managerSession);
// 经理操作测试
System.out.println("\n--- 经理操作测试 ---");
System.out.println("1. 查询任何用户信息:");
String result6 = userService.getUserInfo("user001");
System.out.println("结果: " + result6);
System.out.println("\n2. 查看所有用户:");
List<String> result7 = userService.getAllUsers();
result7.forEach(System.out::println);
System.out.println("\n3. 尝试删除用户:");
boolean result8 = userService.deleteUser("user002");
System.out.println("结果: " + (result8 ? "成功" : "失败"));
System.out.println("\n=== 3. 管理员登录 ===");
UserSession adminSession = new UserSession("admin001", "ADMIN");
proxy.changeSession(adminSession);
// 管理员操作测试
System.out.println("\n--- 管理员操作测试 ---");
System.out.println("1. 查询任何用户信息:");
String result9 = userService.getUserInfo("user001");
System.out.println("结果: " + result9);
System.out.println("\n2. 更新任何用户信息:");
boolean result10 = userService.updateUserInfo("user001", "管理员修改的信息");
System.out.println("结果: " + (result10 ? "成功" : "失败"));
System.out.println("\n3. 删除用户:");
boolean result11 = userService.deleteUser("user002");
System.out.println("结果: " + (result11 ? "成功" : "失败"));
System.out.println("\n4. 查看所有用户:");
List<String> result12 = userService.getAllUsers();
result12.forEach(System.out::println);
System.out.println("\n=== 4. 权限总结 ===");
System.out.println("用户权限(USER):");
System.out.println(" ✅ 查询自己的信息");
System.out.println(" ✅ 更新自己的信息");
System.out.println(" ❌ 查询他人信息");
System.out.println(" ❌ 删除用户");
System.out.println(" ❌ 查看所有用户");
System.out.println("\n经理权限(MANAGER):");
System.out.println(" ✅ 查询任何用户信息");
System.out.println(" ✅ 查看所有用户");
System.out.println(" ❌ 删除用户");
System.out.println("\n管理员权限(ADMIN):");
System.out.println(" ✅ 所有操作权限");
System.out.println("\n=== 保护代理的价值 ===");
System.out.println("🔒 安全性:基于角色的访问控制");
System.out.println("🔒 透明性:客户端无需关心权限逻辑");
System.out.println("🔒 灵活性:可以动态切换用户会话");
System.out.println("🔒 可维护性:权限逻辑集中管理");
}
}
|