【问题标题】:Spring Security REST authorizationSpring Security REST 授权
【发布时间】:2013-03-15 15:34:45
【问题描述】:

我很想知道如何通过 Spring Security REST json 登录。我为 Android/iOS 编写后端。这是我的 security.xml:

<http use-expressions="true" create-session="stateless" entry-point-ref="restAuthenticationEntryPoint">        
        <intercept-url pattern="/auth/**" access="permitAll" />
        <intercept-url pattern="/**" access="isAuthenticated()" />      
        <custom-filter ref="myFilter" position="FORM_LOGIN_FILTER"/>  
        <logout />               
    </http> 

    <beans:bean id="myFilter" class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter">
          <beans:property name="authenticationManager" ref="authenticationManager"/>
          <beans:property name="authenticationSuccessHandler" ref="mySuccessHandler"/>
    </beans:bean>
    <beans:bean id="mySuccessHandler" class="com.teamodc.jee.webmail.security.MySavedRequestAwareAuthenticationSuccessHandler"/>


    <authentication-manager alias="authenticationManager">
        <authentication-provider user-service-ref="userDetailsService" />   
        <authentication-provider ref="authenticationProvider" />
    </authentication-manager> 

    <beans:bean id="authenticationProvider" class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
        <beans:property name="userDetailsService" ref="userDetailsService"/>
    </beans:bean> 

这是我的AuthenticationController:

@Controller
@RequestMapping(value = "/auth")
public class AuthorizationController {

    @Autowired
    @Qualifier(value = "authenticationManager")
    AuthenticationManager authenticationManager;

    private SimpleGrantedAuthority anonymousRole = new SimpleGrantedAuthority("ROLE_ANONYMOUS");

    @RequestMapping(value = "/login", method = RequestMethod.POST, headers = {"Accept=application/json"})
    @ResponseBody
    public Map<String, String> login(@RequestParam("login") String username, @RequestParam("password") String password) {
        Map<String, String> response = new HashMap<String, String>();


            UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(username, password);

            try {
                Authentication auth = authenticationManager.authenticate(token);
                SecurityContextHolder.getContext().setAuthentication(auth);

                response.put("status", "true");             
                return response;
            } catch (BadCredentialsException ex) {
                System.out.println("Login 3");
                response.put("status", "false");
                response.put("error", "Bad credentials");
                return response;
            }
        }

最后,我的 web.xml:

    <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /WEB-INF/spring/appServlet/servlet-context.xml
    </param-value>
</context-param>

<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<servlet>
    <servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/appServlet/dispatcher.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

<filter>
    <filter-name>charsetFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>charsetFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<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>

我已经从 Firefox rest 客户端对其进行了测试,但是当我将 URL 设置为 bla/user/1 时,我花了 401(这是正确的),但是当 URL 为 bla/auth/login 时,我花了 404,然后返回警告 [org.springframework.web.servlet.PageNotFound] - 但是当我在@Controller 中标记路径时会怎样

【问题讨论】:

    标签: java jakarta-ee spring-security restful-authentication


    【解决方案1】:

    您的login() 方法似乎映射到/auth/auth/login。方法级别@RequestMapping注解给出的路径是相对于类级别注解的。

    尝试将方法级别注释更改为@RequestMapping(value = "/login"...

    编辑:
    如果这只是一个错字,并且处理程序映射仍然存在问题,那么请确保在 spring 上下文中具有适当的说明:

    1. &lt;context:component-scan base-package="package.for.controllers"/&gt; 以便将您的控制器实例化为 spring bean。
    2. &lt;mvc:annotation-driven/&gt; 以支持 @RequestMapping 带注释的控制器方法。请参阅reference docs 了解更多信息。

    另外,请确保它们实际上在相同的上下文中(通常在 servlet 上下文中)。

    【讨论】:

    • 不,这是一个错误,当我复制粘贴到这里时。我的问题仍然存在。
    • 谢谢,我检查了我的包裹,但名称错误。现在我有 400 个错误请求。
    • 无论如何,HTTP 400(错误请求)通常是由缺少请求参数引起的。检查您是否按照处理程序方法的要求同时发布了loginpassword。在 org.springframework.web.method.HandlerMethod 上启用跟踪级别日志记录,看看这是否真的是问题的原因。
    猜你喜欢
    • 2014-09-20
    • 2015-10-30
    • 2016-08-08
    • 2017-04-20
    • 2020-04-25
    • 2022-01-06
    • 2020-03-20
    • 2014-05-10
    • 2013-12-01
    相关资源
    最近更新 更多