DEV Community

Cover image for Spring Security: Protecting Your App from Everyone (Including You!)
Nikhil Soman Sahu
Nikhil Soman Sahu

Posted on

Spring Security: Protecting Your App from Everyone (Including You!)

If you've ever spent an afternoon battling with Spring Security, you might feel like the framework was built for one purpose: to protect your app from everyone, even yourself. In fact, it’s almost as if Spring Security operates on the core philosophy of “Hey, let’s make sure no one can access this, especially the guy who built it.”

So buckle up, as we dive into a sarcastic journey through the world of Spring Security, where permissions are denied, roles are confused, and the developer is the ultimate intruder.


Step 1: The Setup – Inviting Chaos

You start with a basic Spring Boot project, full of hope and optimism. “I’ll just add Spring Security for, you know, security,” you think innocently. A few clicks later, you include the Spring Security dependency. Congratulations, your application is now as secure as Fort Knox—and by that, I mean, no one’s getting in. Not your users, not your admin, and definitely not you.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
Enter fullscreen mode Exit fullscreen mode

You see that? You just installed a force field around your app. Who needs access anyway?


Step 2: Access Denied – The Default Security Config

Spring Security’s default configuration is kind of like a bouncer at a nightclub. He doesn’t care who you are—if you’re not on the list, you’re not getting in. In this case, there is no list, so you’re out by default.

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
        .anyRequest().authenticated()
        .and()
        .formLogin().permitAll();
}
Enter fullscreen mode Exit fullscreen mode

The above configuration means your entire app is locked down until authenticated. Even the home page. Yes, the home page! Because why should you have access to your own home, right? Spring Security seems to believe that every route is sacred, and even you, the developer, are not worthy.


Step 3: The Password – Only a Minor Speed Bump

Now that Spring has locked you out of your app, how do you get back in? You open your console and there it is—a randomly generated password printed out just for you. Good luck remembering this 32-character monstrosity:

Using default security password: 9a80989c-78bf-44a5-b96e-8b5d582f7de9
Enter fullscreen mode Exit fullscreen mode

Feeling secure? Because I’m feeling locked out. At this point, it feels like Spring Security is more about security theater than actual functionality. But hey, at least it’s not “admin123.”


Step 4: Configuring User Roles – The Power Struggle

Let's say you want to create an admin role and a user role. Seems simple enough, right? Oh, but this is Spring Security we’re talking about. First, you have to create the roles in the database. Then, you need to grant permissions to your URLs based on these roles. And guess what? Even after you do all that, you'll probably find that no one—not even your admin—can actually access the admin page.

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
        .antMatchers("/admin/**").hasRole("ADMIN")
        .antMatchers("/user/**").hasRole("USER")
        .and()
        .formLogin().permitAll();
}
Enter fullscreen mode Exit fullscreen mode

You’ve now implemented role-based access control (RBAC), which is supposed to give you fine-grained control over who can do what. But in reality, you’ve created a hierarchical mess where not even you are sure what your app is doing anymore.

Want to see something fun? Try assigning roles manually in the database and forget to include the “ROLE_” prefix before the role name. Now, nobody has access to anything. Welcome to your own security dungeon.


Step 5: Customizing Authentication – Because Defaults Are Boring

Feeling brave? Want to customize your authentication process? You’ll quickly learn that Spring Security is very protective of its defaults. Change the login page, and you might accidentally break your entire authentication process. Add OAuth2 into the mix, and you’ll spend the next week wondering why your app now authenticates you somewhere, but you’re not quite sure where.

.and()
.formLogin()
.loginPage("/custom-login")
.failureUrl("/login-error");
Enter fullscreen mode Exit fullscreen mode

The above code changes the default login page to a custom one. Seems easy, right? Until you realize that, despite doing everything correctly, your custom login page throws a 403 Forbidden error. Why? Because you, the developer, have no right to be trusted with something as crucial as a login form.


Step 6: Debugging Spring Security – Good Luck with That

One of the best parts about Spring Security is debugging it. When something goes wrong—and trust me, it will—you'll be met with error messages that look like they were generated by a random error generator.

org.springframework.security.access.AccessDeniedException: Access is denied
Enter fullscreen mode Exit fullscreen mode

Access is denied. To what? Why? Who knows! You can stare at your configuration for hours, try every combination of roles and permissions, and the answer is always the same: Access is denied.

At this point, you’re probably questioning your career choices and wondering if securing your app is really worth the effort. Maybe just having no security at all isn’t such a bad idea...


Conclusion: Embrace the Chaos

Spring Security is undoubtedly powerful. It can protect your app from malicious actors, unauthorized users, and, of course, yourself. But be warned: implementing it will test your patience, your sanity, and your will to keep pushing forward.

The next time you encounter an AccessDeniedException, just remember—it’s not personal. Spring Security just wants to protect you from the real danger... you.

Top comments (0)