---
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]: ./admin
