docbrown/docs/backend/roles.md
2019-12-16 09:25:48 -05:00

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