wordpress权限管理剖析-角色和职能
自从wordpress 2.0引入角色和职能( Roles and Capabilities),就废弃了用户级别(User Level approach)。
主要内容
1.什么是角色和职能(Role and Capabilities)
2.职能和后台管理菜单
3.检查一个用户的职能
4.添加自定义用户角色
5.添加自定义用户职能
6.wordpress职能类(Capability Classes)
1.什么是角色和职能(Role and Capabilities)?
跟其他的CMS,web应用一样,wordpress有一套内建的权限验证系统,验证一个特定的用户是否有足够的权限去执行相应的行为(action).用户(Users)被区分为不同的角色(Role),每种角色被分配相应的职能(Capabilities或Permissions)。
下面是wordpress 默认的角色:
Administrator – 系统管理员 Editor – 编辑,可以发布和编辑自己及他人发布的文章 Author – 作者,可以发布和管理他们自己的文章 Contributor –投稿者,他们可以投稿,和管理他们的文章,但是不能发布。 Subscriber – 订阅者,可以阅读评论和接收newsletter这种角色和职能模式的权限控制系统比使用用户级别来控制权限更加的有弹性,易于扩展。你甚至可以添加更多的角色,而不需要修改默认的设置。 WordPress 插件API允许你添加,移除,改变系统的角色和职能。也就是说,我们可以添加角色,添加职能,重新分配职能给角色。
2.职能和后台管理菜单
几乎每一个插件都需要在管理界面添加至少一个用户配置插件的页面。因而,你需要添加自定义的管理菜单。wordpress里有一系列的方法可以帮你完成这个功能:// add top level menu add_menu_page(page_title, menu_title, capability, handle, [function], [icon_url]); // add sub-menu pages add_submenu_page(parent, page_title, menu_title, capability, file/handle, [function]); // add Options sub-menu add_options_page(page_title, menu_title, capability, handle, [function]); // add Management sub-menu add_management_page(page_title, menu_title, capability, handle, [function]); // add Pages sub-menu add_pages_page( page_title, menu_title, capability, handle, [function]); // add Posts sub-menu add_posts_page( page_title, menu_title, capability, handle, [function]); // add Appearances sub-menu add_theme_page( page_title, menu_title, capability, handle, [function]);你可能已经发现,上面这些函数都有一个必须的参数capability。这意味着登录到后台的用户需要有相应的职能才能够看到这里添加的菜单选项。 如果你的主题或者插件有一个选项页,合理的 控制对该页的访问时非常重要的。例如,如果有一个主题选项页,你需要使用edit_themes这个职能(capability),如果是一个插件选项页,就需要使用edit_plugins职能。另一种方法是为插件和主题选项也使用manage_options这个职能.
3.检查一个用户的职能
检查当前用户是否有足够的职能去执行某些行为(action),可以使用
current_user_can()函数。
if ( current_user_can( $capability ) ) { // do something if the current user has $capability }
这个函数还接收一个可选的参数:文章ID($post_id),为了让你能够检查当前用户是否能够对某一篇文章或某一个页面($post_id)进行操作(如:编辑,删除等):
// check whether the current can edit a post with the ID $post_id current_user_can( 'edit_post', $post_id );
另一个函数author_can( )可以用于检查某个post(可能是文章或者页面或者媒体)的作者是否有相应的职能。
if ( author_can( $post, $capability ) ) { // do something if the author of the post $post has $capability }
4.添加自定义用户角色
有时候有必要为你的插件或者整合程序,添加新的角色到系统中。比如说,你编写了一个文档分享的插件,用户注册后可以上传文档,而且我们只允许他们上传文档。这时最好的方法就是添加一个新的自定义角色:
add_role( $role_name, $display_name, $capabilities ); // for example: add_role( 'document_uploader', 'Document Uploader', array( 'organize_document' ) );
这个函数添加了一个具有一系列职能的新角色。上面的例子添加了一个新的角色叫做“document_uploader”,显示名称“Document Uploader"及一个职能的集合(在这个例子中,职能名称organize_document)。
当你在处理创建,编辑,上传文档请求时,你需要使用current_user_can()来检查当前用户是否被允许执行相应操作。
下一篇我们 将介绍:
if ( current_user_can( 'organize_gallery' ) ) { // do something }被分配了这个角色的用户职能organize_document,但是不能edit_posts或者publish_posts. 如果你想要移除一个角色,可以使用 remove_role( ):
remove_role( 'photo_uploader' );当插件使用者决定卸载你的插件时,你需要给插件使用者提供一个选项来移除这个自定义的角色。 但是,如果你想要给已经存在的用户添加职能应该怎么办?
5.添加自定义用户职能
还是拿上面的例子来说,假如我们的文档分享插件,需要让已有用户角色(如administrator,editor)拥有organize_document的权限,那么应该怎么做?
// get the "author" role object $role = get_role( 'author' ); // add "organize_gallery" to this role object $role->add_cap( 'organize_document');