Introduce
Rolify is a gem in Rails used to support the management of Roles in Rails easily and quickly.
It supports the whole scope on a resource object. For example:
1 2 3 | user <span class="token punctuation">.</span> has_role <span class="token operator">?</span> <span class="token punctuation">(</span> <span class="token symbol">:moderator</span> <span class="token punctuation">,</span> <span class="token variable">@forum</span> <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token keyword">false</span> <span class="token comment"># check user đó có phải là role moderator cho đối tượng forum nào đó không</span> |
Setting
1 2 | gem "rolify" |
=> bundle install
Using
1. Create Role Model
First, I have to use its generator to set up Rolify. Model Role and User are the default names. However, you can also use a different name depending on your actual project.
1 2 | rails g rolify Role User |
The generator will create your Role model, add a migration file, and update your User class with new class methods.
This generator will:
- Create Role model
- Create new migration file
- Update the User model with a new class method
1 2 | rake db:migrate |
2. Configure resource models
In the models you want to apply the role to, you only need to add the resourcify
method as follows:
1 2 3 4 | <span class="token keyword">class</span> <span class="token class-name">Forum</span> <span class="token operator"><</span> <span class="token constant">ActiveRecord</span> <span class="token punctuation">:</span> <span class="token punctuation">:</span> <span class="token constant">Base</span> resourcify <span class="token keyword">end</span> |
Create role for User
Create global Role: Role for all resource objects
1 2 3 | user <span class="token operator">=</span> <span class="token constant">User</span> <span class="token punctuation">.</span> <span class="token function">find</span> <span class="token punctuation">(</span> <span class="token number">1</span> <span class="token punctuation">)</span> user <span class="token punctuation">.</span> add_role <span class="token symbol">:admin</span> |
Create roles for a given resource instance:
1 2 3 | user <span class="token operator">=</span> <span class="token constant">User</span> <span class="token punctuation">.</span> <span class="token function">find</span> <span class="token punctuation">(</span> <span class="token number">2</span> <span class="token punctuation">)</span> user <span class="token punctuation">.</span> add_role <span class="token symbol">:moderator</span> <span class="token punctuation">,</span> <span class="token constant">Forum</span> <span class="token punctuation">.</span> first |
Create roles for certain resource classes:
1 2 3 | user <span class="token operator">=</span> <span class="token constant">User</span> <span class="token punctuation">.</span> <span class="token function">find</span> <span class="token punctuation">(</span> <span class="token number">3</span> <span class="token punctuation">)</span> user <span class="token punctuation">.</span> add_role <span class="token symbol">:moderator</span> <span class="token punctuation">,</span> <span class="token constant">Forum</span> |
Delete role:
1 2 3 | user <span class="token operator">=</span> <span class="token constant">User</span> <span class="token punctuation">.</span> <span class="token function">find</span> <span class="token punctuation">(</span> <span class="token number">3</span> <span class="token punctuation">)</span> user <span class="token punctuation">.</span> remove_role <span class="token symbol">:moderator</span> |
Role queries
Check if the user has global role or not:
1 2 3 4 5 | user <span class="token operator">=</span> <span class="token constant">User</span> <span class="token punctuation">.</span> <span class="token function">find</span> <span class="token punctuation">(</span> <span class="token number">1</span> <span class="token punctuation">)</span> user <span class="token punctuation">.</span> add_role <span class="token symbol">:admin</span> <span class="token comment"># tạo global role</span> user <span class="token punctuation">.</span> has_role <span class="token operator">?</span> <span class="token symbol">:admin</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token keyword">true</span> |
Check if the user has a role on that resource instance:
1 2 3 4 5 6 7 | user <span class="token operator">=</span> <span class="token constant">User</span> <span class="token punctuation">.</span> <span class="token function">find</span> <span class="token punctuation">(</span> <span class="token number">2</span> <span class="token punctuation">)</span> user <span class="token punctuation">.</span> add_role <span class="token symbol">:moderator</span> <span class="token punctuation">,</span> <span class="token constant">Forum</span> <span class="token punctuation">.</span> first <span class="token comment"># tạo role cho resource instance</span> user <span class="token punctuation">.</span> has_role <span class="token operator">?</span> <span class="token symbol">:moderator</span> <span class="token punctuation">,</span> <span class="token constant">Forum</span> <span class="token punctuation">.</span> first <span class="token operator">=</span> <span class="token operator">></span> <span class="token keyword">true</span> user <span class="token punctuation">.</span> has_role <span class="token operator">?</span> <span class="token symbol">:moderator</span> <span class="token punctuation">,</span> <span class="token constant">Forum</span> <span class="token punctuation">.</span> last <span class="token operator">=</span> <span class="token operator">></span> <span class="token keyword">false</span> |
Check if the user has a role on that resource class:
1 2 3 4 5 6 7 8 9 | user <span class="token operator">=</span> <span class="token constant">User</span> <span class="token punctuation">.</span> <span class="token function">find</span> <span class="token punctuation">(</span> <span class="token number">3</span> <span class="token punctuation">)</span> user <span class="token punctuation">.</span> add_role <span class="token symbol">:moderator</span> <span class="token punctuation">,</span> <span class="token constant">Forum</span> <span class="token comment"># tạo role cho resource class</span> user <span class="token punctuation">.</span> has_role <span class="token operator">?</span> <span class="token symbol">:moderator</span> <span class="token punctuation">,</span> <span class="token constant">Forum</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token keyword">true</span> user <span class="token punctuation">.</span> has_role <span class="token operator">?</span> <span class="token symbol">:moderator</span> <span class="token punctuation">,</span> <span class="token constant">Forum</span> <span class="token punctuation">.</span> first <span class="token operator">=</span> <span class="token operator">></span> <span class="token keyword">true</span> user <span class="token punctuation">.</span> has_role <span class="token operator">?</span> <span class="token symbol">:moderator</span> <span class="token punctuation">,</span> <span class="token constant">Forum</span> <span class="token punctuation">.</span> last <span class="token operator">=</span> <span class="token operator">></span> <span class="token keyword">true</span> |
If you create a global role for the user, the gloabl role will override all the roles for the resource:
1 2 3 4 5 6 7 | user <span class="token operator">=</span> <span class="token constant">User</span> <span class="token punctuation">.</span> <span class="token function">find</span> <span class="token punctuation">(</span> <span class="token number">4</span> <span class="token punctuation">)</span> user <span class="token punctuation">.</span> add_role <span class="token symbol">:moderator</span> <span class="token comment"># tạo global role</span> user <span class="token punctuation">.</span> has_role <span class="token operator">?</span> <span class="token symbol">:moderator</span> <span class="token punctuation">,</span> <span class="token constant">Forum</span> <span class="token punctuation">.</span> first <span class="token operator">=</span> <span class="token operator">></span> <span class="token keyword">true</span> user <span class="token punctuation">.</span> has_role <span class="token operator">?</span> <span class="token symbol">:moderator</span> <span class="token punctuation">,</span> <span class="token constant">Forum</span> <span class="token punctuation">.</span> last <span class="token operator">=</span> <span class="token operator">></span> <span class="token keyword">true</span> |
To check if that user has a specific role for a given resource:
1 2 3 4 5 6 7 | user <span class="token operator">=</span> <span class="token constant">User</span> <span class="token punctuation">.</span> <span class="token function">find</span> <span class="token punctuation">(</span> <span class="token number">5</span> <span class="token punctuation">)</span> user <span class="token punctuation">.</span> add_role <span class="token symbol">:moderator</span> <span class="token comment"># tạo a global role</span> user <span class="token punctuation">.</span> has_role <span class="token operator">?</span> <span class="token symbol">:moderator</span> <span class="token punctuation">,</span> <span class="token constant">Forum</span> <span class="token punctuation">.</span> first <span class="token operator">=</span> <span class="token operator">></span> <span class="token keyword">true</span> user <span class="token punctuation">.</span> has_strict_role <span class="token operator">?</span> <span class="token symbol">:moderator</span> <span class="token punctuation">,</span> <span class="token constant">Forum</span> <span class="token punctuation">.</span> last <span class="token operator">=</span> <span class="token operator">></span> <span class="token keyword">false</span> |
The above are the methods needed to use Roliy, but of course there are other methods as well. For more details, refer to its documentation here.