Spring in Action 5th edition Chapter 4

    技术2022-07-11  87

    Chapter 4

    How to enable securityConfig User AuthenticationConfig UrlHow to get the current user

    How to enable security

    add the following dependency

    <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>

    How to config user authentication

    (this is how to customize user authentication)

    First, create a config class

    @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { ... }

    Then override method configure(...)with parameter AuthenticationManagerBuilder.

    @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth .userDetailsService(userDetailService) .passwordEncoder(encoder()); }

    Provide UserDetailsServiceand encoder.

    { UserDetailsService }

    It is an interface.

    interface UserDetailsService

    public interface UserDetailsService { // ~ Methods // ======================================================================================================== /** * Locates the user based on the username. In the actual implementation, the search * may possibly be case sensitive, or case insensitive depending on how the * implementation instance is configured. In this case, the <code>UserDetails</code> * object that comes back may have a username that is of a different case than what * was actually requested.. * * @param username the username identifying the user whose data is required. * * @return a fully populated user record (never <code>null</code>) * * @throws UsernameNotFoundException if the user could not be found or the user has no * GrantedAuthority */ UserDetails loadUserByUsername(String username) throws UsernameNotFoundException; }

    { UserDetails }

    /* * Copyright 2004, 2005, 2006 Acegi Technology Pty Limited * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * https://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.springframework.security.core.userdetails; import org.springframework.security.core.Authentication; import org.springframework.security.core.GrantedAuthority; import java.io.Serializable; import java.util.Collection; /** * Provides core user information. * * <p> * Implementations are not used directly by Spring Security for security purposes. They * simply store user information which is later encapsulated into {@link Authentication} * objects. This allows non-security related user information (such as email addresses, * telephone numbers etc) to be stored in a convenient location. * <p> * Concrete implementations must take particular care to ensure the non-null contract * detailed for each method is enforced. See * {@link org.springframework.security.core.userdetails.User} for a reference * implementation (which you might like to extend or use in your code). * * @see UserDetailsService * @see UserCache * * @author Ben Alex */ public interface UserDetails extends Serializable { // ~ Methods // ======================================================================================================== /** * Returns the authorities granted to the user. Cannot return <code>null</code>. * * @return the authorities, sorted by natural key (never <code>null</code>) */ Collection<? extends GrantedAuthority> getAuthorities(); /** * Returns the password used to authenticate the user. * * @return the password */ String getPassword(); /** * Returns the username used to authenticate the user. Cannot return <code>null</code>. * * @return the username (never <code>null</code>) */ String getUsername(); /** * Indicates whether the user's account has expired. An expired account cannot be * authenticated. * * @return <code>true</code> if the user's account is valid (ie non-expired), * <code>false</code> if no longer valid (ie expired) */ boolean isAccountNonExpired(); /** * Indicates whether the user is locked or unlocked. A locked user cannot be * authenticated. * * @return <code>true</code> if the user is not locked, <code>false</code> otherwise */ boolean isAccountNonLocked(); /** * Indicates whether the user's credentials (password) has expired. Expired * credentials prevent authentication. * * @return <code>true</code> if the user's credentials are valid (ie non-expired), * <code>false</code> if no longer valid (ie expired) */ boolean isCredentialsNonExpired(); /** * Indicates whether the user is enabled or disabled. A disabled user cannot be * authenticated. * * @return <code>true</code> if the user is enabled, <code>false</code> otherwise */ boolean isEnabled(); }

    Config url

    Similar to configurating authentication, first, create a config class or add to an existing one. Then, override method configure(...)with parameter HttpSecurity.

    Example

    @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/post") .hasRole("USER") .antMatchers("/", "/**") .permitAll() .and() .formLogin() .loginPage("/login") .usernameParameter("macid") .passwordParameter("password") .defaultSuccessUrl("/post") .and() .logout() .logoutSuccessUrl("/"); }

    About csrf

    If getting problem that getting 403 forbidden when sending post requests, add a csrf token in the post form by add the folllowing input:

    <input type="hidden" name="_csrf" th:value="${_csrf.token}">

    this is a thymeleaf example.

    How to get current user

    Add @AuthenticationPrincipal User useras a parameter in methods in controller class, where Usershould implement UserDetailsinterface.

    Processed: 0.012, SQL: 9