程序抛出 AccessControlException: access denied... 异常
今天在试验《Java核心技术-卷2》第9章的认证用户访问权限的程序例子(Example 9-8~Example 9-11),在策略文件AuthTest.policy给用户"john"授与属性读取权限,可是在程序中,使用该封装了认证用户的Subject对象去执行PrivilegedAction操作时,仍然报 java.security.AccessControlException: access denied ("java.util.PropertyPermission" "user.home" "read"异常!
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// AuthTest.policy:
grant codebase "file:login.jar"
{
permission javax.security.auth.AuthPermission "createLoginContext.Login1";
permission javax.security.auth.AuthPermission "doAsPrivileged";
};
grant principal com.sun.security.auth.NTPrincipal "john"
{
permission java.util.PropertyPermission "user.*", "read";
};
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 主程序AuthTest.java:
public class AuthTest
{
public static void main(final String[] args)
{
try
{
System.setSecurityManager(new SecurityManager());
LoginContext context = new LoginContext("Login1");
context.login();
System.out.println("Authentication successful.");
Subject subject = context.getSubject();
System.out.println("subject=" + subject);
PrivilegedAction action = new SysPropAction("user.home");
Object result = Subject.doAsPrivileged(subject, action, null);
System.out.println(result);
context.logout();
}
catch (LoginException e)
{
e.printStackTrace();
}
}
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// SysPropAction.java:
public class SysPropAction implements PrivilegedAction
{
/**
Constructs an action for looking up a given property.
@param propertyName the property name (such as "user.home")
*/
public SysPropAction(String propertyName) { this.propertyName = propertyName; }
public Object run()
{
return System.getProperty(propertyName);
}
private String propertyName;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// jaas.config
Login1
{
com.sun.security.auth.module.NTLoginModule required;
};