HttpSecurity, WebSecurity และ AuthenticationManagerBuilder


คำตอบ:


127

กำหนดค่า (AuthenticationManagerBuilder)ใช้เพื่อสร้างกลไกการพิสูจน์ตัวตนโดยอนุญาตให้เพิ่ม AuthenticationProviders ได้อย่างง่ายดายเช่นต่อไปนี้กำหนดการพิสูจน์ตัวตนในหน่วยความจำด้วยการเข้าสู่ระบบ 'ผู้ใช้' และ 'ผู้ดูแลระบบ' ในตัว

public void configure(AuthenticationManagerBuilder auth) {
    auth
        .inMemoryAuthentication()
        .withUser("user")
        .password("password")
        .roles("USER")
    .and()
        .withUser("admin")
        .password("password")
        .roles("ADMIN","USER");
}

กำหนดค่า (HttpSecurity)อนุญาตการกำหนดค่าการรักษาความปลอดภัยบนเว็บในระดับทรัพยากรตามการจับคู่การเลือกเช่นตัวอย่างด้านล่าง จำกัด URL ที่ขึ้นต้นด้วย / admin / สำหรับผู้ใช้ที่มีบทบาท ADMIN และประกาศว่าต้องเป็น URL อื่น ตรวจสอบสิทธิ์เรียบร้อยแล้ว

protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
        .antMatchers("/admin/**").hasRole("ADMIN")
        .anyRequest().authenticated()
}

กำหนดค่า (WebSecurity)ใช้สำหรับการตั้งค่าคอนฟิกูเรชันที่ส่งผลต่อความปลอดภัยทั่วโลก (ละเว้นรีซอร์สตั้งค่าโหมดดีบักปฏิเสธคำขอโดยใช้ข้อกำหนดไฟร์วอลล์ที่กำหนดเอง) ตัวอย่างเช่นวิธีการต่อไปนี้จะทำให้คำร้องขอใด ๆ ที่ขึ้นต้นด้วย / resources / ถูกละเว้นเพื่อวัตถุประสงค์ในการพิสูจน์ตัวตน

public void configure(WebSecurity web) throws Exception {
    web
        .ignoring()
        .antMatchers("/resources/**");
}

คุณสามารถอ้างอิงลิงค์ต่อไปนี้สำหรับข้อมูลเพิ่มเติมSpring Security Java Config Preview: Web Security


2
นิคตอบได้ดี ด้วย spring-security-config-5.0.3 (ซึ่งมาพร้อมกับ spring-boot 2.0.0) ฉันไม่พบวิธีการhttp.authorizeUrls()นี้อาจจะถูกเปลี่ยนชื่อไปhttp.authorizeRequests()บ้าง
Yi Ou

5
ฉันรู้ว่ามันเก่า แต่แนวทางปฏิบัติที่ดีที่สุดคืออะไร ฉันได้พบตัวอย่างของการใช้งานวิธีกำหนดค่า (HttpSecurity http) ที่เรียกใช้ http.antMatchers ("/ foo") permitAll () "ซึ่งดูเหมือนจะเทียบเท่ากับการเรียกใช้ web.ignoring (). antMatchers (" / foo ") ในการกำหนดค่า (WebSecurity web) วิธีการ
chrisinmtown

คำตอบที่ดี ฉันสงสัยว่าเราจำเป็นต้องโทรหา permitAll บน HttpSecurity หรือไม่? เราไม่สามารถเพิกเฉยต่อการกด like / register หรือ / login โดยใช้ WebSecurity ได้หรือไม่? เหตุใดบทช่วยสอนหรือคำตอบทั้งหมดจึงใช้ HttpSecurity.permitAll สำหรับ / register และ / login แต่ WebSecurity.ingore สำหรับ / publics of / resources? -
Mohd Waseem

3

การใช้ignoring()วิธีWebSecurity โดยทั่วไปจะละเว้น Spring Securityและจะไม่มีฟีเจอร์ใด ๆ ของ Spring Security WebSecurity ขึ้นอยู่กับ HttpSecurity

@Override
public void configure(WebSecurity web) throws Exception {
    web
        .ignoring()
        .antMatchers("/resources/**")
        .antMatchers("/publics/**");
}

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
        .antMatchers("/admin/**").hasRole("ADMIN")
        .antMatchers("/publics/**").hasRole("USER") // no effect
        .anyRequest().authenticated();
}

WebSecurity ในตัวอย่างข้างต้นจะช่วยให้ฤดูใบไม้ผลิจะไม่สนใจและ/resources/** /publics/**ดังนั้น.antMatchers("/publics/**").hasRole("USER")ใน HttpSecurity จึงไม่ได้รับการพิจารณา

การดำเนินการนี้จะละเว้นรูปแบบคำขอจากห่วงโซ่ตัวกรองความปลอดภัยทั้งหมด โปรดทราบว่าสิ่งใดก็ตามที่ตรงกับเส้นทางนี้จะไม่มีการใช้บริการการตรวจสอบสิทธิ์หรือการอนุญาตและจะเข้าถึงได้อย่างอิสระ

configure(HttpSecurity)อนุญาตให้กำหนดค่าการรักษาความปลอดภัยบนเว็บที่ระดับทรัพยากรตามการจับคู่การเลือกเช่นตัวอย่างด้านล่าง จำกัด URL ที่ขึ้นต้นด้วย/admin/ผู้ใช้ที่มีบทบาท ADMINและประกาศว่า URL อื่น ๆ ต้องได้รับการตรวจสอบสิทธิ์สำเร็จ

configure(WebSecurity)ใช้สำหรับการตั้งค่าคอนฟิกูเรชันที่ส่งผลต่อความปลอดภัยทั่วโลก (ละเว้นทรัพยากรตั้งค่าโหมดดีบักปฏิเสธคำขอโดยใช้ข้อกำหนดไฟร์วอลล์ที่กำหนดเอง ตัวอย่างเช่นวิธีการต่อไปนี้จะทำให้คำขอใด ๆ ที่ขึ้นต้นด้วย/resources/ถูกละเว้นเพื่อวัตถุประสงค์ในการตรวจสอบสิทธิ์

AuthenticationManagerBuilder
extends AbstractConfiguredSecurityBuilder<AuthenticationManager,AuthenticationManagerBuilder>
implements ProviderManagerBuilder<AuthenticationManagerBuilder>

SecurityBuilder ใช้ในการสร้างAuthenticationManagerไฟล์. ช่วยให้ง่ายในการสร้างการตรวจสอบหน่วยความจำการตรวจสอบ LDAP รับรองความถูกต้องตาม JDBC เพิ่ม UserDetailsService และการเพิ่ม AuthenticationProvider

@Override
     protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().withUser("user").password("password").roles("USER"); 
        auth.userDetailsService(customUserDetailService).passwordEncoder(new BCryptPasswordEncoder());
     }

คำตอบที่ดี ฉันสงสัยว่าเราจำเป็นต้องโทรหา permitAll บน HttpSecurity หรือไม่? เราไม่สามารถเพิกเฉยต่อการกด like / register หรือ / login โดยใช้ WebSecurity ได้หรือไม่? เหตุใดบทช่วยสอนหรือคำตอบทั้งหมดจึงใช้ HttpSecurity.permitAll สำหรับ / register และ / login แต่ WebSecurity.ingore สำหรับ / publics of / resources?
Mohd Waseem
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.