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
Using @PreAuthorize Annotation in Spring Boot
📖 Scenario: You are building a simple Spring Boot REST API for a library system. You want to control access to certain endpoints based on user roles.
🎯 Goal: Learn how to use the @PreAuthorize annotation to restrict access to controller methods by user roles.
📋 What You'll Learn
Create a Spring Boot controller class named BookController
Add a method getAllBooks() that returns a list of book titles
Add a method addBook(String title) to add a new book
Use @PreAuthorize to allow only users with role ROLE_USER to access getAllBooks()
Use @PreAuthorize to allow only users with role ROLE_ADMIN to access addBook(String title)
💡 Why This Matters
🌍 Real World
Role-based access control is common in web applications to protect sensitive operations and data.
💼 Career
Understanding @PreAuthorize and method security is essential for backend developers working with Spring Boot to build secure APIs.
Progress0 / 4 steps
1
Create the BookController class with a list of books
Create a class called BookController annotated with @RestController. Inside it, create a private List<String> called books initialized with "Spring Basics" and "Java Fundamentals".
Spring Boot
Hint
Use @RestController above the class. Initialize books with new ArrayList<>(List.of(...)).
2
Add a configuration variable for role prefix
Add a private static final String variable called ROLE_PREFIX and set it to "ROLE_" inside the BookController class.
Spring Boot
Hint
Define ROLE_PREFIX as a constant string with value "ROLE_".
3
Add methods with @PreAuthorize annotations
Add a method getAllBooks() that returns List<String> and is annotated with @PreAuthorize("hasRole('USER')"). Add another method addBook(String title) annotated with @PreAuthorize("hasRole('ADMIN')") that adds the title to books.
Spring Boot
Hint
Use @PreAuthorize with hasRole('USER') for getAllBooks() and hasRole('ADMIN') for addBook(String title).
4
Add class-level security annotation
Add the @EnableMethodSecurity annotation above the BookController class to enable method-level security.
Spring Boot
Hint
Place @EnableMethodSecurity above the class declaration to activate method security.
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
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.
Step 2: Compare with other options
Logging, dependency injection, and exception handling are unrelated to @PreAuthorize.
Final Answer:
To restrict access to methods based on user roles or permissions before execution -> Option C
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
Step 1: Identify the correct expression for role checking
The expression hasRole('ADMIN') checks if the user has the 'ADMIN' role.
Step 2: Verify other options
hasAuthority('USER') checks for a different role, permitAll() allows everyone, and denyAll() denies everyone.
Final Answer:
@PreAuthorize("hasRole('ADMIN')") -> Option B
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
Step 1: Understand the role restriction
The method requires the user to have 'ADMIN' role to run.
Step 2: Check user role and effect
User has 'USER' role, not 'ADMIN', so access is denied before method runs.
Final Answer:
Access denied error is thrown before method runs -> Option A
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
Step 1: Check syntax of hasRole expression
The role name must be a string inside quotes: hasRole('ADMIN').
Step 2: Verify other options
Return type is not required, @PreAuthorize is correct annotation, so no other errors.
Final Answer:
Missing quotes around 'ADMIN' in hasRole expression -> Option D
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
Step 1: Understand logical operators in @PreAuthorize
Use or to allow access if either condition is true.
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.
Final Answer:
@PreAuthorize("hasRole('ADMIN') or hasAuthority('MANAGER')") -> Option A
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