2016-09-23 3 views
0

В настоящее время я делаю проект на Spring MVC, и я пытаюсь интегрировать Spring Security. Однако я не сделал этого, и я совершенно не понимаю, что мне не хватает. Пожалуйста, взгляните на мой код и предоставьте свои предложения.Почему моя Spring Security не работает?

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:jpa="http://www.springframework.org/schema/data/jpa" 
    xmlns:security="http://www.springframework.org/schema/security" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd 
    http://www.springframework.org/schema/mvc 
    http://www.springframework.org/schema/mvc/spring-mvc.xsd 
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context.xsd 
    http://www.springframework.org/schema/data/jpa 
    http://www.springframework.org/schema/data/jpa/spring-jpa.xsd 
    http://www.springframework.org/schema/security 
    http://www.springframework.org/schema/security/spring-security.xsd"> 

    <security:http auto-config="true" use-expressions="true"> 
     <security:intercept-url pattern="/**" 
      access="hasRole('ROLE_ADMIN')" /> 
     <security:intercept-url pattern="/suser/**" 
      access="isAuthenticated()" /> 
     <!-- <security:intercept-url pattern="/resources/**" access="isAuthenticated()" 
      /> --> 
     <!-- <security:form-login login-page="/home" default-target-url="/doctor" 
      authentication-failure-url="/authfailed" username-parameter="email" password-parameter="password" 
      /> <security:logout logout-success-url="/logoutsuccess" /> <security:csrf/> --> 
     <!-- <security:csrf disabled="true"/> --> 
    </security:http> 

    <security:authentication-manager> 
     <security:authentication-provider 
      user-service-ref="userService"> 

     </security:authentication-provider> 
    </security:authentication-manager> 

    <security:jdbc-user-service id="userService" 
     data-source-ref="dataSource" 
     users-by-username-query="select email , password, true from user where userId=?" 
     authorities-by-username-query="select userId ,'ROLE_ADMIN' from user where userId=?" /> 

</beans>  

Аналогично мой контроллер:

@Controller 
public class MainController { 

    @RequestMapping(value = "/signup", method = RequestMethod.GET) 
    public String getSignupPage() { 
     return "signup"; 
    } 

    @RequestMapping(value = "/home", method = RequestMethod.GET) 
    public ModelAndView getLoginSignupPage() { 

     return new ModelAndView("module/loginsignup/loginsignup",StringConstants.PAGE_TITLE,StringConstants.WEB_APP_TITLE); 
    } 

    @RequestMapping(value = "/index", method = RequestMethod.GET) 
    public String getIndexPage() { 
     return "index"; 
    } 

    @RequestMapping(value = "/admin", method = RequestMethod.GET) 
    public String getAdminPage() { 
     return "admin"; 
    } 

    @RequestMapping(value = "/authfailed", method = RequestMethod.GET) 
    public String getAuthFailPage() { 
     return "autherror"; 
    } 

    @RequestMapping(value = "/logoutsuccess", method = RequestMethod.GET) 
    public String getLogoutSuccessPage() { 
     return "logoutsuccess"; 
    } 

    @RequestMapping(value = "/suser/test", method = RequestMethod.GET) 
    public String getUserPage() { 
     return "user"; 
    } 
} 

Кроме того, мой объект пользователя:

@Entity 
@Table(name="user") 
public class User { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column 
    private long userId; 

    @Column 
    private String firstName; 

    @Column 
    private String middleName; 

    @Column 
    private String lastName; 

    @Column 
    private String email; 

    @Column 
    private String password; 

    @Column 
    private String userStatus; 

    @Column 
    private Date createdDate; 

    @Column 
    private Date updatedDate; 

    @Column 
    private int createdBy; 

    @Column 
    private int updatedBy; 

    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "cityId") 
    private City city; 

    @ManyToMany(cascade = CascadeType.ALL) 
    @JoinTable(name = "user_link_document", 
       joinColumns = @JoinColumn(name = "userId"), 
       inverseJoinColumns = @JoinColumn(name = "documentId")) 
    private List<Document> documentList; 

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "user") 
    private List<Review> reviewList; 

Моей зависимость в build.gradle файл:

dependencies { 
    compile("org.springframework.boot:spring-boot-starter-data-jpa") 
    compile("javax.servlet:jstl:1.2") 
    runtime("mysql:mysql-connector-java") 
    compile("org.springframework.boot:spring-boot-starter-jdbc") 
    compile ("org.springframework.boot:spring-boot-starter-web") 
    compile("org.springframework.boot:spring-boot-starter-security") 
    providedRuntime("org.springframework.boot:spring-boot-starter-tomcat") 
    providedRuntime 'org.apache.tomcat.embed:tomcat-embed-jasper' 
} 

Всех моих конфигурации для Spring MVC верны. У меня нет проблем ни с чем другим, кроме Spring Security. Может кто-нибудь, пожалуйста, скажите мне, что не так? Всякий раз, когда я просматриваю свое приложение, у меня нет учетной записи, которую Spring Security должна запрашивать у пользователя.

ответ

0

Вы должны раскомментировать эту

<security:form-login login-page="/home" default-target-url="/doctor" 
      authentication-failure-url="/authfailed" username-parameter="email" password-parameter="password"/> 

и написать обработчик запроса для /home запроса, который перенаправляет на страницу входа в систему.

+1

Хорошо, что он ведет себя не иначе, даже после раскола: /. – Smrita

+0

раскомментировать это и проверить, доходит ли он до '/ home' или нет и перенаправляется на' module/loginsignup/loginsignup' .... и как вы обращаетесь к своему приложению? 'localhost: xxx/APP /' или 'localhost: xxx/APP/test /' –

1

Вы добавили /** быть ограничено ROLE_ADMIN который улавливает все URLs. Также вы не добавили /home URL-адрес permitAll.

Необходимо сначала добавить все общедоступные URL-адреса, к которым можно получить доступ без входа в систему до следующего шаблона.

<security:intercept-url pattern="/**" 
      access="hasRole('ROLE_ADMIN')" /> 
+1

Эй, но всякий раз, когда весенний контекст безопасности встречается с URL-адресом, который должен быть аутентифицирован, он должен делать чек, что означает, что всякий раз, когда мое приложение запускает его должен запрашивать страницу входа в систему. Я прав ? – Smrita

+0

@Smrita правильный. Но обычно в приложении могут быть некоторые общедоступные URL-адреса, такие как статические ресурсы, login/registration/forgetpwd и т. Д., К которым следует обращаться без входа. Сначала они должны быть объявлены, а затем объявлены все остальные ограничения. –

+0

И ответ: Когда вы настраиваете/**, чтобы быть доступным для пользователей ROLE_ADMIN в качестве первого правила, тогда даже страница входа также может быть ограничена пользователями ROLE_ADMIN, что приводит к бесконечному циклу. –

Смежные вопросы