<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # Spring Security Siteminder 預身份驗證示例 > 原文: [https://howtodoinjava.com/spring-security/spring-3-security-siteminder-pre-authentication-example/](https://howtodoinjava.com/spring-security/spring-3-security-siteminder-pre-authentication-example/) 到目前為止,我們已經了解了使用[**登錄表單安全性**](https://howtodoinjava.com/spring/spring-security/login-form-based-spring-3-security-example/) , [**自定義用戶詳細信息安全性**](https://howtodoinjava.com/spring/spring-security/custom-userdetailsservice-example-for-spring-3-security/)以及更多此類與安全性相關的概念。 在這篇文章中,我舉了一個場景示例,其中已經通過任何第三方應用程序或工具對使用進行了身份驗證,例如[**站點監視程序**](https://docs.oracle.com/cd/E19944-01/819-4520/SiteMinder.html),這是組中多個應用程序之間非常常見的接口。 在這種情況下,**用戶已在任何其他應用程序**中進行了預身份驗證,并使用網站提示器進入您的 Web 應用程序。 網站管理員會發送有關預認證用戶的請求標頭,您可以利用該標頭進一步授權應用程序內的用戶。 您**不需要進一步驗證用戶**,只需從數據庫驗證用戶角色并在應用程序內部提供適當的訪問權限即可。 > 請記住,網站管理員僅是示例,實際上,您可以使用任何第三方 > 應用程序來獲得預先認證的用戶。 在每種情況下,僅請求標頭都會更改。 讓我們逐步學習本教程。 ## 步驟 1)Maven 依賴 我使用 [**maven**](https://howtodoinjava.com/maven/) 作為運行時依賴項,因此提供`pom.xml`。 如果使用的是 ANT,則下載相應的 JAR,并將其添加到類路徑中。 `pom.xml` ```java <properties> <spring.version>3.0.5.RELEASE</spring.version> <jackson-mapper-asl.version>1.9.9</jackson-mapper-asl.version> <jaxb-api.version>2.2.7</jaxb-api.version> </properties> <dependencies> <!-- Spring 3 dependencies --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> <scope>runtime</scope> </dependency> <!-- Spring Security --> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-core</artifactId> <version>${spring.version}</version> <type>jar</type> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-web</artifactId> <version>${spring.version}</version> <type>jar</type> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-config</artifactId> <version>${spring.version}</version> <type>jar</type> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-taglibs</artifactId> <version>${spring.version}</version> <type>jar</type> <scope>runtime</scope> </dependency> </dependencies> ``` ## 步驟 2)更新`web.xml`文件 `web.xml`文件中沒有太多內容。 只需添加**上下文配置位置**和 **Spring Security 相關??的過濾器映射**即可。 `web.xml` ```java <web-app> <display-name>www.howtodoinjava.com</display-name> <servlet> <servlet-name>spring-mvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>spring-mvc</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring-mvc-servlet.xml</param-value> </context-param> <filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>springSecurityFilterChain</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> </web-app> ``` ## 步驟 3)Spring Security 配置 這是最重要的步驟,因為在這里我們將配置與驗證前安全性相關的映射。 讓我們看一下文件: `spring-mvc-servlet.xml` ```java <beans xmlns="http://www.springframework.org/schema/beans" xmlns:security="http://www.springframework.org/schema/security" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.3.xsd"> <!-- Annotation are configuring the application --> <mvc:annotation-driven/> <!-- Scan this package for all config annotations --> <context:component-scan base-package="com.howtodoinjava.web" /> <security:http use-expressions="true" auto-config="false" entry-point-ref="http403EntryPoint"> <!-- Additional http configuration omitted --> <security:intercept-url pattern="/**" access="hasRole('ROLE_USER')" /> <security:custom-filter position="PRE_AUTH_FILTER" ref="siteminderFilter" /> </security:http> <bean id="siteminderFilter" class="org.springframework.security.web.authentication.preauth.RequestHeaderAuthenticationFilter"> <property name="principalRequestHeader" value="SM_USER"/> <property name="authenticationManager" ref="authenticationManager" /> </bean> <bean id="preauthAuthProvider" class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider"> <property name="preAuthenticatedUserDetailsService"> <bean id="userDetailsServiceWrapper" class="org.springframework.security.core.userdetails.UserDetailsByNameServiceWrapper"> <property name="userDetailsService" ref="customUserDetailsService"/> </bean> </property> </bean> <security:authentication-manager alias="authenticationManager"> <security:authentication-provider ref="preauthAuthProvider" /> </security:authentication-manager> <bean id="customUserDetailsService" class="com.howtodoinjava.security.CustomUserDetailsService"></bean> <bean id="http403EntryPoint" class="org.springframework.security.web.authentication.Http403ForbiddenEntryPoint"></bean> </beans> ``` 讓我們了解以下配置: 1. `mvc:annotation-driven`用于告訴 spring 它需要在`context:component-scan`中指定的基本包中掃描注解,以搜索資源映射。 2. `security:http`配置指定與安全性相關的配置和選項。 `use-expressions`告訴您,與`security: intercept-url`中的`access`屬性匹配時,允許使用表達式,并應對其進行解析。 3. `security:custom-filter`指定了自定義過濾器的定義,該過濾器將被調用以驗證用戶的有效性。 4. `PRE_AUTH_FILTER`確保在其他身份驗證/授權處理之前將調用此過濾器。 我為此定義了一個`siteminder`過濾器。 您可以將其命名為其他名稱。 5. `principalRequestHeader`很重要,因為一旦用戶從另一個應用程序進入應用程序,它將檢查請求標頭屬性。 因此,請第三方供應器提供的此標頭在此處集成。 6. `authenticationManager`最終使用了我在`com.howtodoinjava.security.CustomUserDetailsS??ervice`類中編寫的`customUserDetailsS??ervice`。此類實現[`UserDetailsS??ervice`](http://static.springsource.org/spring-security/site/docs/3.0.x/apidocs/org/springframework/security/core/userdetails/UserDetailsService.html)接口,并具有一種方法`loadUserByUsername()`。 此方法必須返回類型為[`org.springframework.security.core.userdetails.UserDetails`](http://static.springsource.org/spring-security/site/docs/3.0.x/apidocs/org/springframework/security/core/userdetails/UserDetails.html)的經過身份驗證的用戶界面。 該對象將具有其他授權詳細信息,例如用戶角色,將用于進一步的安全性。 ## 步驟 4)編寫自定義`UserDetailsS??ervice`類 此類將獲取從第三方應用程序傳遞的用戶名,并將用戶名作為請求標頭傳遞,例如在我們的情況下為`SM_USER`。 `CustomUserDetailsService.java` ```java package com.howtodoinjava.security; import org.springframework.dao.DataAccessException; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.GrantedAuthorityImpl; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; public class CustomUserDetailsService implements UserDetailsService { public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException { System.out.println("username recieved :: " + username); @SuppressWarnings("deprecation") //Get this user details from database and set its roles also here UserDetails user = new User(username, "password", true, true, true, true, new GrantedAuthority[]{ new GrantedAuthorityImpl("ROLE_USER") }); return user; } } ``` ## 步驟 5)編寫安全資源以進行驗證 為了簡單起見,我編寫了兩個非常基本的類。 我將嘗試在沒有請求標頭“ `SM_USER`”的情況下訪問它們。 #### `DemoController.java` `DemoController.java` ```java package com.howtodoinjava.web; @Controller @RequestMapping("/users") public class DemoController { @RequestMapping(method = RequestMethod.GET, value="/{id}", headers="Accept=application/xml") public @ResponseBody User getUserById(@PathVariable String id) { User user = new User(); user.setFirstName("john"); user.setLastName("adward"); return user; } @RequestMapping(method = RequestMethod.GET, headers="Accept=application/xml") public @ResponseBody Users getAllUsers() { User user1 = new User(); user1.setFirstName("john"); user1.setLastName("adward"); User user2 = new User(); user2.setFirstName("tom"); user2.setLastName("hanks"); Users users = new Users(); users.setUsers(new ArrayList<User>()); users.getUsers().add(user1); users.getUsers().add(user2); return users; } } ``` #### `Users.java` `Users.java` ```java @XmlRootElement(name="users") @XmlAccessorType(XmlAccessType.NONE) public class Users { @XmlElement(name="user") private Collection<User> users; public Collection<User> getUsers() { return users; } public void setUsers(Collection<User> users) { this.users = users; } } ``` `User.java` `User.java` ```java @XmlRootElement(name="user") @XmlAccessorType(XmlAccessType.NONE) public class User { @XmlElement(name="first-name") private String firstName; @XmlElement(name="last-name") private String lastName; public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } } ``` ## 步驟 6)示范 讓我們將應用程序部署在 tomcat 服務器中并進行測試。 #### 情況 1:不帶`SM_USER`請求頭 這將引發以下異常: ```java org.springframework.security.web.authentication.preauth.PreAuthenticatedCredentialsNotFoundException: SM_USER header not found in request. at org.springframework.security.web.authentication.preauth.RequestHeaderAuthenticationFilter.getPreAuthenticatedPrincipal(RequestHeaderAuthenticationFilter.java:43) at org.springframework.security.web.authentication.preauth.AbstractPreAuthenticatedProcessingFilter.doAuthenticate(AbstractPreAuthenticatedProcessingFilter.java:98) at org.springframework.security.web.authentication.preauth.AbstractPreAuthenticatedProcessingFilter.doFilter(AbstractPreAuthenticatedProcessingFilter.java:86) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:79) at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380) at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:169) at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237) ``` ![Spring security pre-authentication error](https://img.kancloud.cn/94/08/94084f872a6cbde605791ea7bff1fd6c_1188x578.jpg) Spring security 預認證錯誤 #### 情況 2:帶`SM_USER`請求標頭 這次,用戶將可以訪問資源。 ![Spring security pre-authentication success](https://img.kancloud.cn/2d/72/2d726a5a2cbeab3695704beefb368910_833x436.jpg) Spring security 預認證成功 要下載以上教程的源代碼,請點擊以下下載鏈接。 [**下載源碼**](https://docs.google.com/file/d/0B7yo2HclmjI4a080SnpaLS0wcjg/edit?usp=sharing) 學習愉快!
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看