75 lines
1.9 KiB
Markdown
75 lines
1.9 KiB
Markdown
---
|
|
title: Roles
|
|
---
|
|
|
|
# Roles
|
|
|
|
## What is a role?
|
|
|
|
If authorization is about who has permission to be allowed to do what you want
|
|
to do, then Roles are common patterns of authorization across users - reducing
|
|
the administrative overhead.
|
|
|
|
## Why do I need to know about roles?
|
|
|
|
Some bugs can only be seen for users with specific roles. You will need to
|
|
change the role to reproduce a problem.
|
|
|
|
## How do we implement roles in DEV.to?
|
|
|
|
Roles are implemented in this application using [Rolify][1]. The list of roles
|
|
can be found in [app/models/role.rb][2] and you can search for [has_role in the
|
|
codebase][3] to find which pages need which roles.
|
|
|
|
A new user starts without any roles, and there is no administrative way of
|
|
adding roles to users yet. To assign a user a role you will have to run commands
|
|
at the console.
|
|
|
|
## Example of adding permissions to a user
|
|
|
|
- open the Rails console
|
|
|
|
```shell
|
|
rails console
|
|
```
|
|
|
|
- after verifying the user `test_user_name` is missing the `pro` role we proceed
|
|
to add it and then verify the role has been added:
|
|
|
|
```ruby
|
|
> user = User.find_by(username: "test_user_name")
|
|
> user.has_role? :pro
|
|
=> false
|
|
|
|
> user.add_role :pro
|
|
=> #<Role:
|
|
...
|
|
name: "pro"
|
|
.. >
|
|
|
|
> user.has_role? :pro
|
|
=> true
|
|
```
|
|
|
|
Another common requirement is changing to the administrative role, and an
|
|
example of this is found [on the admin page][5].
|
|
|
|
## Verification
|
|
|
|
A more complex query to list all the users and their roles:
|
|
|
|
```ruby
|
|
User.joins(:roles).order(:id).group(:id).pluck(:id, :username, Arel.sql("array_agg(roles.name)"))
|
|
```
|
|
|
|
## Further Reading
|
|
|
|
1. [Rolify README.md][1]
|
|
2. [What is the purpose of Rolify?][4]
|
|
3. [Admin][5]
|
|
|
|
[1]: https://github.com/RolifyCommunity/rolify
|
|
[2]: https://github.com/thepracticaldev/dev.to/blob/master/app/models/role.rb
|
|
[3]: https://github.com/thepracticaldev/dev.to/search?q=has_role&unscoped_q=has_role
|
|
[4]: https://stackoverflow.com/a/16096790/1511504
|
|
[5]: /backend/admin
|