(1)在配置文件中使用hadoop.job.ugi指定用户组信息,用户名+组名(String[]),UnixUserGroupInformation的login方法首先尝试从Configuration中获得用户组信息,如果失败就从配置文件中读,如果失败就Get current user's name and the names of all its groups from Unix,Shell类中的内部类ShellCommandExecutor用来执行Shell程序。如果失败,则用户名为DrWho,组名为Tardis。获得用户名和组名后,会把信息写入Configuration。
(2)ConnectionPermission(继承Permission)被AccessController用来访问控制,其中ConnectionPermission的imply方法最为关键,它决定了Permission之间如何比较,ConnectionPermission中的imply比较protocol域,只有两个protocol域相等或者被比较的Permmision的protocol域为VersionedProtocol的时候才可以通过比较也就是imply返回true。
(3)Service类key表示一项服务的key,当然这里面也有这个服务的Permission,服务的key在配置文件中使用配置可以访问这项服务的用户。AccessControlList类中有两个set,分别表示用户名和组名,布尔值allAllowed表示所有用户和组。ConfiguredPolicy用来提供策略,所谓的策略其实就是什么Principal有哪些Permission,其中allowedPermissions表示所有Principal都具有的Permission,permissions就是表达策略。ConfiguredPolicy 要覆盖几个方法getPermissions,接受一个ProtectionDomain,返回ProtectionDomain中Principal具有的Permission集合,implies判断一个ProtectionDomain是否可以imply一个Permission,refresh重置策略。然后在初始化的时候使用Policy.setPolicy就可以啦。
(4)Subject.doAs会用传入的主体和要做的动作(PrivilegedAction),最终会调用AccessController.doPrivileged使得设置的Policy得以应用,通过Policy可以把执行的主体转化成Permission,利用Permission和PrivilegedAction需要的Permission做比较,问题出现了,Java是通过什么方式判断PrivilegedAction需要哪些Permission的呢?留着问牛人吧