下面是通过Spring Security魔幻山谷讲解获取认证机制核心原理的完整攻略,包含了两条示例。
一、认证机制核心原理
Spring Security的认证机制是基于过滤器链来实现的,具体流程如下:
- 用户提交认证请求;
- 表单过滤器(FilterSecurityInterceptor)拦截请求,检查请求的路径是否需要进行身份认证;
- 如果需要认证,则由过滤器链中的身份认证过滤器(AuthenticationFilter)处理认证请求;
- 认证过滤器通过用户提供的身份信息进行验证,如果验证通过,则由认证过滤器生成一个认证成功的Authentication对象,保存到SecurityContextHolder中;
- 认证成功后,过滤器链中的授权过滤器(AccessDecisionManager)会对用户的权限进行验证;
- 如果权限验证通过,则用户可以访问请求的资源,否则拒绝访问。
二、示例1:基于表单登录的认证方式
我们假设现在有一个需要进行身份认证的页面/login,用户需要输入用户名和密码才能访问该页面。
- 在web.xml中配置FilterSecurityInterceptor过滤器,指定需要保护的页面路径和需要使用的认证方式。
<filter>
<filter-name>filterSecurityInterceptor</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>filterSecurityInterceptor</filter-name>
<url-pattern>/login*</url-pattern>
</filter-mapping>
- 在Spring配置文件中配置AuthenticationManager,定义用户的身份验证方式。
<authentication-manager>
<authentication-provider>
<user-service>
<user name="admin" password="admin" authorities="ROLE_ADMIN"/>
<user name="user" password="user" authorities="ROLE_USER"/>
</user-service>
</authentication-provider>
</authentication-manager>
- 在Spring配置文件中配置AuthenticationFilter和AccessDecisionManager。
<bean id="authenticationFilter" class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter">
<property name="authenticationManager" ref="authenticationManager"/>
<property name="authenticationFailureHandler" ref="failureHandler"/>
<property name="authenticationSuccessHandler" ref="successHandler"/>
<property name="filterProcessesUrl" value="/login"/>
</bean>
<bean id="accessDecisionManager" class="org.springframework.security.access.vote.UnanimousBased">
<property name="decisionVoters">
<list>
<bean class="org.springframework.security.web.access.expression.WebExpressionVoter"/>
</list>
</property>
</bean>
- 在Spring配置文件中配置Spring Security的基础信息。
<security:http auto-config="false" use-expressions="true">
<security:intercept-url pattern="/login*" access="permitAll"/>
<security:form-login login-page="/login" login-processing-url="/login/authenticate" authentication-failure-url="/login?error=true" />
<security:logout logout-url="/logout" logout-success-url="/"/>
<security:access-denied-handler error-page="/403"/>
</security:http>
- 编写登录页面表单内容,使用POST方式提交至/login/authenticate路径进行身份认证。
<form action="/login/authenticate" method="post">
<label>Username:</label>
<input type="text" name="username"/>
<br/>
<label>Password:</label>
<input type="password" name="password"/>
<br/>
<input type="submit" value="Login"/>
</form>
三、示例2:基于HTTP基本认证的认证方式
我们假设现在有一个API接口需要进行身份认证,我们使用HTTP基本认证方式来实现。
- 在web.xml中配置FilterSecurityInterceptor过滤器,指定需要保护的API接口路径和需要使用的认证方式。
<filter>
<filter-name>filterSecurityInterceptor</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>filterSecurityInterceptor</filter-name>
<url-pattern>/api/**</url-pattern>
</filter-mapping>
- 在Spring配置文件中配置AuthenticationManager,定义用户的身份验证方式。
<authentication-manager>
<authentication-provider>
<user-service>
<user name="admin" password="admin" authorities="ROLE_ADMIN"/>
<user name="user" password="user" authorities="ROLE_USER"/>
</user-service>
</authentication-provider>
</authentication-manager>
- 在Spring配置文件中配置HttpBasicAuthenticationEntryPoint和AccessDecisionManager。
<bean id="basicAuthenticationEntryPoint" class="org.springframework.security.web.authentication.www.BasicAuthenticationEntryPoint">
<property name="realmName" value="my_realm"/>
</bean>
<bean id="accessDecisionManager" class="org.springframework.security.access.vote.UnanimousBased">
<property name="decisionVoters">
<list>
<bean class="org.springframework.security.web.access.expression.WebExpressionVoter"/>
</list>
</property>
</bean>
- 在Spring配置文件中配置Spring Security的基础信息。
<security:http auto-config="false" use-expressions="true">
<security:intercept-url pattern="/api/**" access="hasRole('ROLE_USER')" />
<security:http-basic entry-point-ref="basicAuthenticationEntryPoint" />
<security:access-denied-handler error-page="/403"/>
</security:http>
- 编写代码对API进行访问,使用HTTP基本认证方式进行身份认证。
public void accessAPI() throws Exception {
String url = "http://localhost:8080/api/getUserInfo";
HttpClient client = new HttpClient();
UsernamePasswordCredentials credentials = new UsernamePasswordCredentials("admin", "admin");
client.getState().setCredentials(AuthScope.ANY, credentials);
HttpMethod get = new GetMethod(url);
client.executeMethod(get);
System.out.println(get.getResponseBodyAsString());
}
这就是通过Spring Security魔幻山谷讲解获取认证机制核心原理的完整攻略,同时还包含了两条示例。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:通过Spring Security魔幻山谷讲解获取认证机制核心原理 - Python技术站