我无法使用 Spring Security 登录

Posted

技术标签:

【中文标题】我无法使用 Spring Security 登录【英文标题】:I cannot login using Spring Security 【发布时间】:2019-01-12 16:34:42 【问题描述】:

我在尝试使用 Spring Security 登录我的应用程序时遇到问题,无论我做什么,它总是将我重定向到我用于非授权访问的 JSP。

security-config.xml 的配置我试过hasRole('ROLE_USER')permitAll 都没有工作。

security-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans
    xmlns="http://www.springframework.org/schema/security"
    xmlns:beans="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/security
    http://www.springframework.org/schema/security/spring-security.xsd">
    <http>
        <intercept-url pattern="/user/**" access="hasAnyRole('ROLE_USER') />
        <form-login login-page="/customLogin.jsp"
            login-processing-url="/appLogin" 
            username-parameter="app_username"
            password-parameter="app_password" 
            default-target-url="/user/home" />
        <logout 
            logout-url="/appLogout"
            logout-success-url="/customLogin.jsp" />
        <access-denied-handler error-page="/user/error" />
    </http>
    <beans:bean name="bcryptEncoder"
        class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder" />
    <beans:bean name="myAppUserDetailsService"
        class="com.prh.tracking.services.impl.UserDetailsServiceImpl" />
    <beans:bean name="userService"
        class="com.prh.tracking.services.impl.UserServiceImpl" />
    <authentication-manager>
        <authentication-provider
            user-service-ref="myAppUserDetailsService">
            <password-encoder ref="bcryptEncoder" />
        </authentication-provider>
    </authentication-manager>
    <global-method-security
        secured-annotations="enabled" />
</beans:beans>

UserController.java

@Controller
@RequestMapping("/user")
public class UserController 

    @Autowired
    private UserService userService;

    @RequestMapping(value="/home")
    public String home(ModelMap model, Authentication authentication) 

        authentication.getPrincipal();
        model.addAttribute("user", userService.getUser(authentication.getName()));

        return "user-info";
    
    @RequestMapping(value="/error")
    public String error() 
        return "access-denied";
    

UserDetailsS​​erviceImpl.java

@Service
public class UserDetailsServiceImpl implements UserDetailsService

    @Autowired
    private UserDAO userDAO;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException 
        UserEntity user = userDAO.getUser(username);

        GrantedAuthority authority = new SimpleGrantedAuthority(user.getRole());
        UserDetails userDetails = (UserDetails)new User(user.getName(), user.getPassword(), Arrays.asList(authority));

        return userDetails;
    


这是我的数据库中的内容:

【问题讨论】:

@GauravSrivastav 好吧,我找到了一个关于这个的教程,然后我就开始学习 Spring Security。 执行,祝你好运。 @GauravSrivastav 我希望在进行更多更改之前解决此问题,或者 Spring Security 仅适用于 Spring Boot? 如何查看密码? @sajib 就像我说的我遵循了一个教程并且仍然试图了解一切是如何工作的,我认为它是通过 UserDetailsServiceImp 完成的,因为如果我尝试使用错误的密码访问,我会收到一条消息说凭据不正确。 【参考方案1】:

当您设置对permitAll 的访问权限时,您甚至不应该被要求提供凭据,并且根本不会咨询 UserDetailsS​​erviceImpl。

您可能需要启用这样的网络安全表达式: &lt;http use-expressions="true"&gt;

看 https://docs.spring.io/spring-security/site/docs/3.0.x/reference/el-access.html#el-access-web

【讨论】:

以上是关于我无法使用 Spring Security 登录的主要内容,如果未能解决你的问题,请参考以下文章

仅使用 Spring Security 自定义令牌无状态保护 REST 控制器,同时保持常规状态完整 Web 登录正常工作

Grails/Spring Security:无法使用新创建的用户登录

自定义登录表单无法使用 Spring Security

Grails Spring Security Core无法登录

Spring Security 无法注销

不登录就无法访问静态资源目录(我使用的是spring security)