Câu trả lời được chấp nhận không chính xác: không thể xác định chính sách bảo mật sẽ ngăn mã tạo và bắt đầu chuỗi mới bằng cách sử dụng Trình quản lý bảo mật Java chuẩn.
Hãy nói rằng bạn có đoạn mã sau:
public class Test {
public static void main(String [] args) {
System.out.println(System.getSecurityManager() != null ? "Secure" : "");
Thread thread = new Thread(
new Runnable() {
public void run() {
System.out.println("Ran");
}
});
thread.start();
}
}
và bạn chạy nó với lệnh sau đây:
java -Djava.security.manager -Djava.security.policy==/dev/null Test
nó sẽ chạy tốt và đầu ra:
Secure
Ran
mặc dù chúng tôi đã đặt chính sách bảo mật thành/dev/null, điều này sẽ cấp không cho phép đối với bất kỳ mã nào. Do đó, không thể cấp ít quyền hơn để ngăn mã tạo chuỗi đó.
Điều này là do java.lang.SecuritManager chuẩn chỉ thực hiện kiểm tra quyền nếu mã cố gắng tạo một chuỗi trong ThreadGroup gốc. Đồng thời, getThreadGroup mehtod của SecurityManager luôn trả về nhóm luồng của Thread hiện tại, sẽ không bao giờ là nhóm chủ đề gốc, vì vậy việc cho phép tạo một Thread mới sẽ luôn được cấp.
Một cách để làm tròn điều này là phân lớp java.lang.SecurityManager và ghi đè phương thức getThreadGroup để trả về ThreadGroup gốc. Điều này sau đó sẽ cho phép bạn kiểm soát xem mã có thể tạo chủ đề dựa trên việc nó có java.lang.RuntimePermission "modifyThreadGroup" hay không.
Vì vậy, nếu bây giờ chúng ta định nghĩa một lớp con của SecurityManager như sau:
public class ThreadSecurityManager extends SecurityManager {
private static ThreadGroup rootGroup;
@Override
public ThreadGroup getThreadGroup() {
if (rootGroup == null) {
rootGroup = getRootGroup();
}
return rootGroup;
}
private static ThreadGroup getRootGroup() {
ThreadGroup root = Thread.currentThread().getThreadGroup();
while (root.getParent() != null) {
root = root.getParent();
}
return root;
}
}
và sau đó chạy lệnh của chúng tôi một lần nữa, nhưng lần này quy định cụ thể ThreadSecurityManager subclassed của chúng tôi:
java -Djava.security.manager=ThreadSecurityManager -Djava.security.policy==/dev/null Test
Chúng tôi nhận được một ngoại lệ trong lớp Kiểm tra của chúng tôi khi chúng tôi cố gắng tạo chủ đề mới:
Exception in thread "main" java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "modifyThreadGroup")
Ngôn ngữ lập trình nào? –
java, tôi đã thêm vào chủ đề và mô tả. – bastiat