כניסה יחידה פשוטה עם OAuth2 באבטחת אביב (מחסנית מדור קודם)

1. סקירה כללית

במדריך זה נדון כיצד ליישם SSO - כניסה יחידה - באמצעות Spring Security OAuth ו- Spring Boot.

נשתמש בשלושה יישומים נפרדים:

  • שרת Authorization - שהוא מנגנון האימות המרכזי
  • שתי יישומי לקוח: היישומים המשתמשים ב- SSO

במילים פשוטות מאוד, כאשר משתמש מנסה לגשת לדף מאובטח באפליקציית הלקוח, הוא ינותב לאימות תחילה, באמצעות שרת האימות.

ואנחנו נשתמש ב- קוד אימות הענק סוג מ- OAuth2 כדי להניע את משלחת האימות.

הערה: מאמר זה משתמש בפרויקט מורשת Spring OAuth. לגרסה של מאמר זה המשתמש בערמת Spring Security 5 החדשה, עיין במאמר כניסה יחידה פשוטה עם Spring Security OAuth2.

2. אפליקציית הלקוח

נתחיל ביישום הלקוח שלנו; נשתמש כמובן באביב אתחול כדי למזער את התצורה:

2.1. תלות Maven

ראשית, נצטרך את התלות הבאות שלנו pom.xml:

 org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-security org.springframework.security.oauth.boot spring-security-oauth2-autoconfigure 2.0.1.RELEASE org.springframework.boot spring-boot-starter-thymeleaf org.thymeleaf.extras thymeleaf-extras-springsecurity4 

2.2. תצורת אבטחה

לאחר מכן, החלק החשוב ביותר, תצורת האבטחה של יישום הלקוח שלנו:

@Configuration @ EnableOAuth2Sso מחלקה ציבורית UiSecurityConfig מרחיב את WebSecurityConfigurerAdapter {@ Override public void configure (HttpSecurity http) זורק חריג {http.antMatcher ("/ **"). AutorizeRequests () .antMatchers ("/", "/ login **" .permitAll () .anyRequest (). מאומת (); }}

החלק המרכזי בתצורה זו הוא, כמובן @ EnableOAuth2Sso ביאור שאנו משתמשים בו כדי להפעיל כניסה יחידה.

שים לב שעלינו להרחיב את ה- מתאם WebSecurityConfigurer - בלעדיו, כל הנתיבים יאובטחו - כך שהמשתמשים יופנו מחדש להתחבר כאשר הם מנסים לגשת לדף כלשהו. במקרה שלנו כאן, דפי האינדקס והכניסה הם הדפים היחידים שניתן לגשת אליהם ללא אימות.

לבסוף, הגדרנו גם א RequestContextListener שעועית לטיפול בהיקפי בקשות.

וה application.yml:

שרת: יציאה: 8082 servlet: path-context: / ui session: cookie: name: UISESSION אבטחה: basic: מופעל: false oauth2: client: clientId: SampleClientId client Secret: access secretTokenUri: // localhost: 8081 / auth / oauth / token userAuthorizationUri: // localhost: 8081 / auth / oauth / authorise resource: userInfoUri: // localhost: 8081 / auth / user / me spring: thymeleaf: cache: false

כמה הערות מהירות:

  • השבתנו את ברירת המחדל של אימות בסיסי
  • accessTokenUri הוא ה- URI להשיג את אסימוני הגישה
  • userAuthorizationUri הוא URI ההרשאה שמשתמשים יופנו אליו
  • userInfoUri ה- URI של נקודת הקצה של המשתמש לקבלת פרטי המשתמש הנוכחיים

שים לב, בדוגמה שלנו כאן, הפצנו את שרת ההרשאה שלנו, אך כמובן שנוכל להשתמש גם בספקי צד שלישי אחרים כמו פייסבוק או GitHub.

2.3. חזיתי

עכשיו, בואו נסתכל על התצורה הקדמית של יישום הלקוח שלנו. אנחנו לא מתכוונים להתמקד בזה כאן, בעיקר בגלל שכבר סיקרנו באתר.

ליישום הלקוחות שלנו כאן יש חזית פשוטה מאוד; הנה ה index.html:

 התחברות

וה securePage.html:

 ברוך הבא, שם

ה securePage.html הדף נדרש לאמת את המשתמשים. אם משתמש שאינו מאומת מנסה לגשת securePage.html, הם יופנו לדף הכניסה תחילה.

3. שרת האימות

עכשיו בואו נדון כאן בשרת ההרשאה שלנו.

3.1. תלות Maven

ראשית, עלינו להגדיר את התלות שלנו pom.xml:

 org.springframework.boot spring-boot-starter-web org.springframework.security.oauth spring-security-oauth2 2.3.3.RELEASE 

3.2. תצורת OAuth

חשוב להבין שאנחנו הולכים להריץ כאן את שרת ההרשאה ואת שרת המשאבים, כיחידה ניתנת לפריסה.

נתחיל בתצורה של שרת המשאבים שלנו - המשמש גם כיישום האתחול העיקרי שלנו:

@SpringBootApplication @EnableResourceServer המחלקה הציבורית AuthorizationServerApplication מרחיבה את SpringBootServletInitializer {main public public static (String [] args) {SpringApplication.run (AuthorizationServerApplication.class, args); }}

לאחר מכן נגדיר את שרת ההרשאה שלנו:

@Configuration @EnableAuthorizationServer המחלקה הציבורית AuthServerConfig מרחיב AuthorizationServerConfigurerAdapter {@Autowired פרטי BCryptPasswordEncoder passwordEncoder; תצורת הריקות הציבורית של @Override (AuthorizationServerSecurityConfigurer oauthServer) זורקת Exception {oauthServer.tokenKeyAccess ("permitAll ()") .checkTokenAccess ("isAuthenticated ()"); } @ קביעת תצורה ריקה ציבורית של @Override (לקוחות ClientDetailsServiceConfigurer) זורק חריג {clients.inMemory () .withClient ("SampleClientId"). Secret (passwordEncoder.encode ("סוד")). AuthorizedGrantTypes ("קוד הרשאה"). סקופס ("משתמש_מידע") ) .autoApprove (true) .redirectUris ("// localhost: 8082 / ui / login", "// localhost: 8083 / ui2 / login"); }}

שים לב כיצד אנו מאפשרים רק לקוח פשוט המשתמש ב- קוד אימות סוג מענק.

כמו כן, שימו לב איך אישור אוטומטי מוגדר כ- true כך שלא ננתב מחדש ונקדם לאשר ידנית טווחים כלשהם.

3.3. תצורת אבטחה

ראשית, נשבית את אימות בסיסי המוגדר כברירת מחדל, באמצעות שלנו application.properties:

server.port = 8081 server.servlet.context-path = / auth

עכשיו, בואו נעבור לתצורה ונגדיר מנגנון כניסה פשוט לטופס:

@Configuration @Order (1) מחלקה ציבורית SecurityConfig מרחיב את WebSecurityConfigurerAdapter {@Override מוגן חלל מוגדר (HttpSecurity http) זורק חריג {http.requestMatchers () .antMatchers ("/ login", "/ oauth / authorize") .and (). authorizeRequests () .anyRequest (). מאומת () .and () .formLogin (). permitAll (); } תצורת הריק המוגנת על ידי @Override (AuthenticationManagerBuilder auth) זורקת חריג {auth.inMemoryAuthentication () .withUser ("john"). סיסמה (passwordEncoder (). קידוד ("123")) .roles ("USER"); } @Bean BCryptPasswordEncoder הציבורי passwordEncoder () {להחזיר BCryptPasswordEncoder חדש (); }}

שים לב שהשתמשנו באימות פשוט בזיכרון, אך אנו יכולים פשוט להחליף אותו בהתאמה אישית userDetailsService.

3.4. נקודת קצה של משתמש

לבסוף, ניצור את נקודת הקצה של המשתמשים בה השתמשנו קודם בתצורה שלנו:

@RestController מחלקה ציבורית UserController {@GetMapping ("/ user / me") משתמש ראשי ציבורי (מנהל ראשי) {return return; }}

באופן טבעי, זה יחזיר את נתוני המשתמש עם ייצוג JSON.

4. מסקנה

במדריך מהיר זה, התמקדנו ביישום כניסה יחידה באמצעות Spring Security Oauth2 ו- Spring Boot.

כמו תמיד, ניתן למצוא את קוד המקור המלא ב- GitHub.


$config[zx-auto] not found$config[zx-overlay] not found