Bird
Raised Fist0
Spring Bootframework~5 mins

@PreAuthorize annotation in Spring Boot

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Introduction

The @PreAuthorize annotation helps control who can use certain parts of your app by checking user permissions before running a method.

You want to allow only admins to delete user accounts.
You want to let users see their own data but not others'.
You want to restrict access to certain features based on user roles.
You want to secure service methods in your backend.
You want to check permissions using simple expressions before method runs.
Syntax
Spring Boot
@PreAuthorize("expression")
public ReturnType methodName(Parameters) {
    // method code
}

The expression inside quotes is a SpEL (Spring Expression Language) condition.

Common expressions check roles like hasRole('ROLE_ADMIN') or permissions like hasAuthority('PERMISSION').

Examples
This method can only be run by users with the ADMIN role.
Spring Boot
@PreAuthorize("hasRole('ADMIN')")
public void deleteUser(Long id) {
    // delete user code
}
This method allows users to update only their own profile by comparing usernames.
Spring Boot
@PreAuthorize("#user.name == authentication.name")
public void updateProfile(User user) {
    // update profile code
}
This method requires the user to have a specific authority and a valid id.
Spring Boot
@PreAuthorize("hasAuthority('READ_PRIVILEGE') and #id > 0")
public Data getData(Long id) {
    // fetch data code
}
Sample Program

This service has two methods. The deleteUser method only lets admins delete users. The updateProfile method lets users update their own profile by checking their username matches the logged-in user.

Spring Boot
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @PreAuthorize("hasRole('ADMIN')")
    public String deleteUser(Long id) {
        return "User " + id + " deleted.";
    }

    @PreAuthorize("#username == authentication.name")
    public String updateProfile(String username) {
        return "Profile updated for " + username;
    }
}
OutputSuccess
Important Notes

Make sure to enable method security in your Spring Boot app with @EnableMethodSecurity.

Use hasRole('ROLE_NAME') or hasAuthority('AUTHORITY') depending on your security setup.

Expressions can access method parameters with #paramName and the current user with authentication.

Summary

@PreAuthorize checks permissions before running a method.

Use simple expressions to control access based on roles or user data.

It helps keep your app secure by limiting who can do what.

Practice

(1/5)
1. What is the main purpose of the @PreAuthorize annotation in Spring Boot?
easy
A. To inject dependencies into a method
B. To log method execution time automatically
C. To restrict access to methods based on user roles or permissions before execution
D. To handle exceptions thrown by a method

Solution

  1. Step 1: Understand the role of @PreAuthorize

    This annotation is used to check if a user has the right role or permission before allowing method execution.
  2. Step 2: Compare with other options

    Logging, dependency injection, and exception handling are unrelated to @PreAuthorize.
  3. Final Answer:

    To restrict access to methods based on user roles or permissions before execution -> Option C
  4. Quick Check:

    Access control = A [OK]
Hint: Remember: @PreAuthorize controls access before method runs [OK]
Common Mistakes:
  • Confusing @PreAuthorize with logging or exception handling
  • Thinking it injects dependencies
  • Assuming it runs after method execution
2. Which of the following is the correct syntax to allow only users with role 'ADMIN' to access a method using @PreAuthorize?
easy
A. @PreAuthorize("denyAll()")
B. @PreAuthorize("hasRole('ADMIN')")
C. @PreAuthorize("permitAll()")
D. @PreAuthorize("hasAuthority('USER')")

Solution

  1. Step 1: Identify the correct expression for role checking

    The expression hasRole('ADMIN') checks if the user has the 'ADMIN' role.
  2. Step 2: Verify other options

    hasAuthority('USER') checks for a different role, permitAll() allows everyone, and denyAll() denies everyone.
  3. Final Answer:

    @PreAuthorize("hasRole('ADMIN')") -> Option B
  4. Quick Check:

    Role check syntax = D [OK]
Hint: Use hasRole('ROLE_NAME') to restrict by role [OK]
Common Mistakes:
  • Using wrong role name or authority
  • Confusing hasRole with hasAuthority
  • Using permitAll() when restriction is needed
3. Given the method below, what will happen if a user with role 'USER' calls it?
@PreAuthorize("hasRole('ADMIN')")
public String adminOnly() {
    return "Welcome Admin";
}
medium
A. Access denied error is thrown before method runs
B. The method executes and returns 'Welcome Admin'
C. The method executes but returns null
D. The method executes and returns 'Welcome User'

Solution

  1. Step 1: Understand the role restriction

    The method requires the user to have 'ADMIN' role to run.
  2. Step 2: Check user role and effect

    User has 'USER' role, not 'ADMIN', so access is denied before method runs.
  3. Final Answer:

    Access denied error is thrown before method runs -> Option A
  4. Quick Check:

    Role mismatch causes denial = A [OK]
Hint: If role missing, @PreAuthorize blocks method [OK]
Common Mistakes:
  • Assuming method runs anyway
  • Thinking it returns null instead of error
  • Confusing roles 'USER' and 'ADMIN'
4. Identify the error in this usage of @PreAuthorize:
@PreAuthorize("hasRole(ADMIN)")
public void secureMethod() { }
medium
A. Annotation should be @PostAuthorize instead
B. Method must return a value to use @PreAuthorize
C. No error, syntax is correct
D. Missing quotes around 'ADMIN' in hasRole expression

Solution

  1. Step 1: Check syntax of hasRole expression

    The role name must be a string inside quotes: hasRole('ADMIN').
  2. Step 2: Verify other options

    Return type is not required, @PreAuthorize is correct annotation, so no other errors.
  3. Final Answer:

    Missing quotes around 'ADMIN' in hasRole expression -> Option D
  4. Quick Check:

    Role names need quotes = C [OK]
Hint: Always put role names in quotes inside hasRole() [OK]
Common Mistakes:
  • Omitting quotes around role names
  • Confusing @PreAuthorize with @PostAuthorize
  • Thinking method must return a value
5. How would you use @PreAuthorize to allow access only if the user has either 'ADMIN' role or 'MANAGER' authority?
hard
A. @PreAuthorize("hasRole('ADMIN') or hasAuthority('MANAGER')")
B. @PreAuthorize("hasRole('ADMIN') and hasAuthority('MANAGER')")
C. @PreAuthorize("hasRole('ADMIN')") @PreAuthorize("hasAuthority('MANAGER')")
D. @PreAuthorize("permitAll()")

Solution

  1. Step 1: Understand logical operators in @PreAuthorize

    Use or to allow access if either condition is true.
  2. Step 2: Analyze options

    @PreAuthorize("hasRole('ADMIN') or hasAuthority('MANAGER')") uses or correctly; @PreAuthorize("hasRole('ADMIN') and hasAuthority('MANAGER')") requires both roles which is stricter; @PreAuthorize("hasRole('ADMIN')") @PreAuthorize("hasAuthority('MANAGER')") is invalid to use two annotations; @PreAuthorize("permitAll()") allows everyone.
  3. Final Answer:

    @PreAuthorize("hasRole('ADMIN') or hasAuthority('MANAGER')") -> Option A
  4. Quick Check:

    Use 'or' for either role or authority = B [OK]
Hint: Combine roles with 'or' inside one @PreAuthorize [OK]
Common Mistakes:
  • Using 'and' instead of 'or' when either role suffices
  • Trying to stack multiple @PreAuthorize annotations
  • Using permitAll() which allows everyone