Spring Security 6 | How to Create a Login System with Spring Data JPA and JWTs [NEW 2023]
Вставка
- Опубліковано 23 лип 2024
- Spring Security can be a massive rabbit hole when you get started. This is exactly what happened to me when I started researching how to add encryption to the backend of my Twitter clone here on UA-cam. I poured hours and hours of watching tutorials and trying to figure out how to tweak one tutorial to do this, or another tutorial that was outdated to do that. Finally, I stumbled upon some non-outdated tutorials, but they still lacked exactly what I needed and I still had to link multiple different tutorial videos together to get to where I am now. If you have been in my place before, or if you are at where I was right now this is the video for you.
In this video we are going to sit down from the start of an application and build out an entire authenticated backend server with login and register features connected to a database. We are also going to implement the generation of JWT's so you can have a stateless backend, and we will use OAuth2Resource server to verify that the JWT's sent back are valid, and then authorize requests to specific routes based on the users roles. We will do all of this from scratch so you can understand where we started and how we got to the finish line.
I highly recommend that you watch through the entire video for context, however, here is the link to the project code:
github.com/unknownkoder/sprin...
~~~ Feeling Generous? Donate to the channel for the all the hard work that made this video ~~~
streamlabs.com/unknownkoder/tip
~~~ Stay Up To Date With My Social Media ~~~
Twitter: / unknownkoder
Twitch: / unknownkoderyt
Be sure to subscribe and turn on the bell notifications on youtube to not miss another episode of Lets Build Twitter: shorturl.at/gnxZ8
~~~ Background Music Used In My Video ~~~
Astroblk - Nothing Really matters that much to me anymore
Aviscerall - Sanctuary
Cøzybøy - Please Don't Drown
Astroblk - explorer
Knwln Ryan - Can't Replace You
NetNavi - How Can You Tell
Astroblk - Vancouver
Aviscerall - Lullabyes
Cøzybøy - Deep In Snow
Astroblk - Courage
Aviscerall - Coffee Shop
Cøzybøy - I'll Do Anything
Astroblk - Pay Up _____
Aviscerall - Chillin'
Cøzybøy - I Feel Okay Today
Astroblk - fleids
Aviscerall - Progress
Cøzybøy - What Do You know About Love
Astroblk - Geneva
Knwln Ryan - Jupiter
Astroblk - Ginger Spice
Aviscerall - Clockin' Out
Knwln Ryan - Waterfalls
Aviscerall - Feelings
Astroblk - Soul in Seoul
NetNavi - To A Song
Astroblk - Sunrise
Aviscerall - Onett
~~~ Video Content ~~~
0:00:00 - Introduction
0:03:05 - Prerequisites
0:04:34 - Project Diagram
0:06:05 - Project Creation
0:12:01 - application.properties setup
0:17:04 - Creating the UserController
0:19:56 - Creating the AdminController
0:21:32 - Testing User and Admin Endpoints
0:22:37 - Installing Spring Security
0:24:43 - Utilizing the default Spring Security password
0:25:57 - Unlocking the API
0:28:45 - Creating the Role model
0:32:26 - Creating the ApplicationUser model
0:38:32 - Creating the UserService
0:42:20 - Configuring basic authentication
0:47:38 - Creating the Repository layer
0:51:20 - Loading Roles and Admin User
0:55:13 - Using the UserRepository in the UserService
0:58:05 - Creating the AuthenticationService and registerUser method
1:04:12 - Creating the AuthenticationController and registerUser method
1:09:22 - Configuring all traffic to AuthenticationController
1:11:53 - Creating the KeyGenerator utility class
1:14:37 - Creating the RSAKeyProperties class
1:16:21 - Installing OAuthResourceServer
1:17:29 - Configuring Spring Security to use OAuthResourceServer
1:22:05 - Creating the TokenService
1:26:54 - Creating the LoginResponseDTO class
1:28:37 - Creating the loginUser method in AuthenticationService
1:32:52 - Creating the loginUser method in the AuthenticationController
1:34:11 - Testing user login
1:36:23 - Configuring role based authorization
1:42:44 - Testing role based authorization
1:43:52 - Outro
#unknownkoder #javaprogramming #springsecurity
You had me in the first 20 seconds , tutorial hell has brought me here i was almost loosing my mind on spring security
Fantastic Video, Thank you for putting all this together in one place and having it explained very clearly and at a steady pace. Great work!!!
What a fantastic to the point video it is, Thank you so much Ethan for sharing valuable knowledge with all of us, my knowledge before and after watching this video has increased very much, looking forward to more of your videos.
I had watched a bunch of videos on this topic, but your explanation made it much easy to follow and code along with you.
Amazing video! Such a complex topic was explained in a relatively simple way, thank you!
Excellent tutorial. This is just what I needed to get started.
The Best explanation I have even seen for spring security and jwt authentication. Thanks alot.
This video is a compilation of everything useful that is said in the other videos, discarding all the other useless things that are said, updating it to the latest versions of spring.
Liked the video, keep it up.
It was indeed an absolute Behemoth of a video! Great tutorial, loved the pacing and the explanations. My subscribe and like is your good sir.
Well done. Had some troubles with dependencies but overall your video is quite amazing! Thank you so much!
clear and concise, great video mate!
perfect video, everything will go smoothly without getting any blocker for me, thanks brother for such a nice video😍
Thank you so much! I highly recommend this video to anyone who wants to learn about Spring Security. It is a comprehensive and informative resource :)
This video hit the nail on the head, I watched countless other videos from other people before I found this one, and the content was either outdated or poorly explained. I appreciate that you did everything from scratch and explained each step. Wish I found this video about 8 videos earlier, but I finally understand the whole implementation process for Jwt's. 11/10 will watch again.
if u get it can u help me ?
Thanks, for this great tutorial. Concise and blazingly fast.
This is a really great tutorial. Thanks for this
All I could say this is an extraordinary tutorial. I tried all of the spring security tutorials but they did not cover the nitty gritty aspects of it like the jwt token creation and authorization but you just were superb. Thank you very much for uploading a gem ❤
Absolutely amazing video, learned a lot from this, Thanks!!
After thousands of videos on spring security, I finally found an excellent one
This video is the best spring security video ❤
great content video with proper explanation keep doing contents like this 😍, i was looking for this type content for many days, i just wasted a lot of time but this saved my time and can explain how to save roles in DB annd retrieve it from DB and also about OAuth 2.0
You just revived my passion for spring boot based backend development. Thank you so much. This is the best spring security crash course I've found on UA-cam even better than the inspirations you mentioned in this video. The reason is, that you used less jargon and fancy Java. You showed basic Java skills to explain an already complex spring security concept which feels smooth.
Most of the creators from the Java community tend to use a lot of fancy Java design patterns and advanced Java features which causes great difficulty for freshers to understand such complex concepts.
Constructive Criticism:
I have one small suggestion for you, the cutting of your voice is really not good. There are no pauses between your speech, leading to you sounding monotonous even when you're not. Also, it made me rewind many times since I never understood where one sentence ended and the other began.
Love your content. keep going ♥
Thank you so much after searching alot i found this video that covered my ground up spring security and jwt thank you man.
Wow, first time I get it right. Thank you! This channel should have much more followers.
I had some issues using Lombok, but when I did all the constructors, getters, setters manually it's finally worked! I guess I need more experience with constructors first, then use lombok.
I have also had issues with Lombok and I know others sometimes do as well. That is why I chose not to use it in this video.
Wow, you had me in the first 20 seconds. Got the problem absolutely spot on. thanks
I have done exactly as you have mentioned in the video upto configuring basic authentication, I keep getting 401 unauthorized exception despite supplying the username and password correctly
Holy crap. Thank you so much; this is amazing. Top tier content. I learned so much from this compared to hours of Amigoscode or Dan Vega. Nothing against those guys, they just have so much content to get through and a lot of it is outdated. Thank you so much for putting this together. I got what I needed out of it and then some.
thanks for this awesome tutorial! very helpful!
Brother, you are a lifesaver!
This is a greate tutorial. Thanks for that!
Great video, really helpful!
Good video, I watched it to the end, kinda hard to understand the whole thing because I've just started learning this framework but with the time for sure I will comeback and watch it again!
Absolute legend for making this
GOAT
This was fantastic! I followed it, but changed JPA to jdbcTemplate, because the road to Hell is paved with too much abstraction. Doing it that way, everything made perfect sense. Thank you!
excellent tutorial, and thank you for the timestamps!
Liked the video! Here's an idea for future tutorials, can you create git branches for each chapter? this way we can go back and forth between different chapters to compare and contrast the changes.
Great video and working around the deprecated methods wasn’t too bad and was a very good practice of working with documentation. Thanks for putting this all together. 👏🏼👏🏼👏🏼
how did you get the JwtAuthenticationConverter to work in the SecureityFilterChain ?
@@mathewfrancis4167 I’ll check in a bit and get back to you
@@fetterollie54I'll be infinitely great-full when you will :)
@@mathewfrancis4167
Not sure if you can put code blocks in here:
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception{
http
// disable cross site request forgery
.csrf(csrf -> csrf.disable())
// any http requests are authorized
.authorizeHttpRequests(auth -> {
auth.requestMatchers("/auth/**").permitAll();
auth.requestMatchers("/admin/**").hasRole("ADMIN");
auth.requestMatchers("/user/**").hasAnyRole("ADMIN", "USER");
auth.anyRequest().authenticated();
});
http
.oauth2ResourceServer((oauth2) -> oauth2.jwt(jwt -> jwt.jwtAuthenticationConverter(jwtAuthenticationConverter())));
http
.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS));
// build into security chain
return http.build();
};
Also I stepped away from the project a month ago and haven’t looked at it since. Hope this is what you are looking for…
Wow. Thank you for this. Brilliant
thanks for a clear video. its incredible how spring security team has no good documentation for spring security 6
mega tutorial man, THANKS !
Wonderful! Thanks!
Thank You! That was very helpful
tôi mới học khá lúng túng với spring security nhưng xem hết video của bạn tôi đã hiểu hơn rất nhiều, cảm ơn video của bạn.
one of the best security tutorial, clear explanation, am now confidence about spring security. Thank you @Unknown Coder
my project is not running bro
Can you help me with something? I got stuck at some point
Insane video. Ty so much
Much needed video on the upgraded ways of Spring Security, I'm glad that i was able to find it
I have a request though, could you also post a video on formLogin using spring security
Great content, thanks a lot!!
thank you for you effort, great job!
Thank you for the video!
Thanks for this video!
Man, this video is top notch. It is exactly what was missing from youtube. Could you, please, share with us, how did you figure all this out? What materials did you use for documentation or how was your thought process? Or maybe is it just experience? I watched Dan Vegas' video about JWT and I was really wondering how to achieve role authorization. I wouldn't have figured it out by myself.
fantastic video thanks lot
fantastic video
Thank you so much bro, you are a life saver
What I usually want to see in security videos is handling security for different type of roles. E.g a backend service for sellers and buyers, drivers and riders, students and teachers and so on
lo que tu quieres es manejo de roles
hey have you figured it out ? any other resources you found ? cause I have to implement it in project
this logic is implemented in the SecurityFilterChain bean in your security configuration class
great video helped me a lot
This video is amazing
Very good video
Spring Security is confusing but you did a great job.
I found a lot of things in one place it helped me a lot.
Thanks
Great Video..Thank you so much
great video!
Thank you for your tutorial
Bro this is golden
Big thanks, Sir 🥰🥰🥰
Well done. A 1000 thanks
Thank for the detailed explanation, please suggest how to do authentication for an application using Thymeleaf and MVC controller.
Toturial hell got me here bro 🗿👍🏿
Yeah, very true.about 80% of the videos sessions use deprecated modules
TU É FODA MAN, VC É INCRIVELLLLLLLL
Thank you !!!!
Thanks for the vid, the deprecated APIs were a pain in the ass!
It really was legit hell, YT algorithm was hiding you from me too 😂
THANK YOU
Mind blowing
very good content
in first minutes I subscribed
sick hoodie man
Trust me I haven't started this tutorial, I just read the description and I know Spring Security is bagged already😆😅
Finally found a video for working around the older deprecated methods. Thank you very much.
Edit:
Unable to generate the jwt token during login, and getting a 401 Unauthorized error response back.
Might be an issue with the deprecated jwt() method in oauth2ResourceServer(oauth2ResourceServerConfigurer::jwt()).
But even with the new code oauth2ResourceServer(oauth2 -> oauth2.jwt(Customizer.withDefaults())) which provides a default implementation of the oauth2ResourceServerConfigurer class its not working.
If anyone has faced the same issue and solved it, Please let me know. Thank you.
I had exact the same issue but I skipped the line 'daoProvider.setPasswordEncoder(passwordEncoder());' under SecurityConfiguration class -> AuthenticationManager ... i had only "daoProvider.setUserDetailsService(detailsService);" hope it helps.
Yes please help in this. I am facing the same issue in intellij.
@@TheMrBaticaBut here daoAuthenticationProvider.setUserDetailsService(detailsService) is used . So what did you exactly change
I wrote what was my problem. I didn't have -> 'daoProvider.setPasswordEncoder(passwordEncoder());
@@TheMrBatica Thanks, I had the same problem. Maybe someone has the same issue, so here I put proper code: @Bean
public AuthenticationManager authManager(UserDetailsService detailsService) {
DaoAuthenticationProvider daoProvider = new DaoAuthenticationProvider();
daoProvider.setUserDetailsService(detailsService);
daoProvider.setPasswordEncoder(passwordEncoder());
return new ProviderManager(daoProvider);
}
It was brilliant, please add oauth 2 support for the same repo
fyi if you are struggling with deprecated methods, or other things (example: I was unable to run project due to an error with the security filter chain method, request matchers specifically. You can always just downgrade the version of Spring Boot in your POM.xml to use what was used in the video and everything will work.
Nice idea
best ever
thank you
Lovely just what i needed ... i'm new to this level of spring security ... so I hope this question isn't a silly one ... i would like to know how and where you generated the public and private key in you code... thank you :)
Awesome video, I followed everything you said (mostly) and got postman working at the end, but Im a bit confused on how to implement a login page and move to a secured page?
Great Content!!! Can you make a video on how this authentication backend works with API gateway ? Any of the members if know
Hi, this was an exhaustive example I've been looking for. Thank you very much!
I would like to extend this project with static HTML pages. How can I do that?
I've added HTML pages (e.g. an index.html under resources/static) but I can't access any of the pages. they're all blank and I get 401 responses to them.
I tried to add the static path to auth request matchers, but no joy so far. Any ideas what's missing? Thanks in advance!
thank you sooooooooooo much!
I am using DOMA, I can't declare the Set authorities as it says it is not supported as persistent type.
Thank you for the video, do you know how i can be able to display this information in my next js project
There is a problem casting the Principal to UserDetails as per your implementation.. any ideas? Am trying to get the logged in user via SecurityContextHolder.. thanks
I how to do to allow user to access and resource when his already been logged. and don't have toprovide access token again on the frond end?
Hi!
When I run the Maven app and try and access an endpoint in browser I get: “Request Method ‘GET’ is not supported.
Do you know what could be causing this?
The only difference between yours is I am using Postgres driver.
Thanks!
I'm trying to do this with MongoDb as the database, and I lose myself when i end up trying to create the roles. Since MongoDb isnt a relational db, its a little confusing when im trying to make "join tables"
Greate tutorial,
Am asking for getting an end-point which returns an access token by accepting refresh token, Note Access token should also be returned on login attempt.
From your implementation, how will it be possible to add permission to a users roles? from what I can see, there can only be one authority/permission. I am not too clear on that part.
Also previous videos I have seen usually have a secret in the application.properties file that the jwt encoder uses. why dont we have that? is it because we are using the RSA encryption thing? if you have links that explain this in springboot context, I will appreciate if you can share it.
I also did notice one downside in that if the application restarts, users have to login again. Can you explain why this is so?
And for some reasons, when I try to log the currently logged in user using @AuthenticationPrincipal, I get an error
Is there any need for the JWT Auth Converter to set the roles to "ROLE_ROLENAME" if you just set the roles in the DB to be begin with "ROLE_"?
Hey guys! Is it normal for role authorization to not work without a Converter even if we set the role in DB as ROLE_ADMIN for example? Because I just spent a lot of time with it and it did not work at all even if I would use roles such as "ROLE_USER", "ROLE_ADMIN". It began working only after setting the roles in DB as simply "ADMIN" and "USER" then adding the converter as in the video.
Hi would you be kind to show the logout part?
Whats the tool being used to create the architectural diagram in your video?
Now I am experiencing dependencies cycle from AuthenticationService to SecurityConfiguration with the AuthenticationManager. How am I fix this?
Do I understand it correctly that in the client after login i need to save the token from server response and put it to every request made afterwards?