Deadlock condition

Как я добивал SPRING-SECURITY 3.0+MVC+HIBERNATE+MAVEN

Как мы знаем с каждым днем языки программирования совершенствуются, разрабатываются различные плагины и т.п, если посмотрим в сторону ООП языка Java, то увидим не то что с каждым днем, аж с каждой секундой добавляются новые технологии, фреймворки, плагины.
Сегодня мы поговорим про фреймворк Spring, точнее часть его составляющего Spring Security 3.0.
Я не буду тут сочинять целую книгу про spring-security 3, а опишу основные аспекты данного модуля все подробности можете прочитать тут или тут.
В момент написания этого блога 3 версия этого модуля была последней, так что при создании прошу учитывать зависимости версии плагинов (благо создали билдер Maven). Начали...
Мы будем рассматривать самый простой пример, а остальное зависит от ваших фантазии.
Инструменты в которых я смастерил проект:

Intellij IDEA 10.0.1
Apache Tomcat 7.0.8
Apache Maven 3.0.2
Postgresql 8.4

В Intellij IDEA 10 версии есть функционал который создает Maven проект, по умолчанию он вам создаст следующее дерево каталогов...

Теперь самое серьезное, создадим сам pom.xml файл, в нем мы будем хранить иерархию зависимостей библиотек (dependencies), если кто не знаком с пакетом Maven тынц сюда . Какие нам пакеты понадобятся:
junit 3.8.1
org.springframework 3.0.5.RELEASE
org.hibernate 3.3.0.GA
dom4j 1.6.1
org.slf4j 1.6.1
commons-logging 1.1.1
commons-collections 3.2.1
antlr 2.7.7
postgresql 8.4-702.jdbc4
org.springframework.security 3.0.5
javax.servlet
commons-codec 1.3



pom.xml :

    
      junit
      junit
      3.8.1
      test
    
 
    
     org.springframework
     spring-web
     3.0.5.RELEASE
     jar
     compile
    
    
     org.springframework
     spring-core
     3.0.5.RELEASE
     jar
     compile
    
    
     org.springframework
     spring-tx
     3.0.5.RELEASE
     jar
     compile
    
    
        org.springframework
        spring-orm
        3.0.5.RELEASE
    
    
  org.springframework
  spring-jdbc
  2.5.6
    
   
 
        org.hibernate
        hibernate
        3.2.7.ga
    
    
        hibernate
        hibernate-entitymanager
        3.4.0.GA
    
    
  
        org.hibernate
        hibernate-annotations
        3.3.0.GA
    

 
        org.hibernate
        hibernate-commons-annotations
        3.3.0.ga
    

 
 
  dom4j
  dom4j
  1.6.1
 
    
        org.slf4j
        slf4j-api
        1.6.1
    
 
  commons-logging
  commons-logging
  1.1.1
 
 
  commons-collections
  commons-collections
  3.2.1
 
 
  antlr
  antlr
  2.7.7
 
 
    
  postgresql
  postgresql
  8.4-702.jdbc4
    
    
 
     org.springframework.security
     spring-security-core
     3.0.5.RELEASE
     jar
     compile
    
    
     org.springframework
     spring-aop
     3.0.5.RELEASE
     jar
     compile
    
    
     org.springframework.security
     spring-security-config
     3.0.5.RELEASE
     jar
     compile
    
    
     org.springframework.security
     spring-security-web
     3.0.5.RELEASE
     jar
     compile
    

    
        org.springframework.security
        spring-security-taglibs
        3.0.5.RELEASE
    

    
 
  org.springframework
  spring-webmvc
  3.0.5.RELEASE
 

 
 
  javax.servlet
  jstl
  1.1.2
 

    
     javax.servlet
  servlet-api
  2.5
 

 
  taglibs
  standard
  1.1.2
 
   
    
        commons-codec
        commons-codec
        1.3
    


С "Maven"ом разобрались, теперь по порядку, будем по очереди все складывать по полочкам:

Полочка - 1.


Spring MVC.
Если вы внимательно просмотрели pom.xml, то можете заметить следующие библиотеки:

 
  org.springframework
  spring-webmvc
  3.0.5.RELEASE
 

именно они будут отвечать за проектировку паттерна модель-представление-контроллер (MVC), подробно тынц сюда .

Начнем с настройки web.xml

        springSecurityFilterChain
        org.springframework.web.filter.DelegatingFilterProxy
    
    
        springSecurityFilterChain
        /*
    

    
        contextConfigLocation
        
            /WEB-INF/applicationContext-security.xml
            classpath*:context.xml
        
    
    
    
        org.springframework.web.context.ContextLoaderListener
    

    
   mvc-dispatcher
        org.springframework.web.servlet.DispatcherServlet
        1
  

  
  mvc-dispatcher
        *.htm
  

особое внимание надо обратить на блок mvc-dispatcher, именно он будет отвечать за пере направления представлений, далее мы это все увидим. Кстати чуть не забыл, название сервлета должен совпадать с названием файла настройки dispatcher, т.е мы должны аналогичным образом создать xml файл
mvc-dispatcher-servlet.xml

        
        
    


    

  
    
      
   
   




тут я думаю вам не составит труда все это переварить :)
контреллер - который будет все контролировать, грубо говоря командовать кому куда и что делать :).
SpringPageController.java

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;

public class SpringPageController extends AbstractController{
    @Override
 protected ModelAndView handleRequestInternal(HttpServletRequest request,
  HttpServletResponse response) throws Exception {
        ModelAndView model = new ModelAndView("SpringPage");
  model.addObject("msg","Hello world");
  return model;
 }
}

основной конфигурационный файл spring framwork а , я его назвал context.xml

        
        
        
        
    

    
    
        
    
     

    
        

представление SpringPage.jsp
<h2>${msg}</h2>

вроде ничего не забыл...
и последний штрих для проверки mvc паттерна в индекс файл добавляем гиперссылку такого рода:

<a href="/welcome.htm">Тест Spring - MVC</a>

Полочка - 2


Spring Security 3.0+Hibernate
Здесь я буду приводить пример со связкой с БД таблицами (Обычная простая версия описания Spring Security вы можете найти в Интернете, их на валом, google поможет...)

В время разработки некоторых мелких проектов связанных с авторизация, правами доступа и т.п лучшее не находил, простота, удобство, стабильность и т.п. Ну  если кто нибудь не согласен с моими мнениями  я не в обиде, как говориться на вкус и цвет товарища нет.
Для начала рассмотрим конфигурационный файл applicationContext-security.xml


   
        
        
        
    
    
    
        
    


Что мы тут видим, а видим мы все :)   я думаю вам трудности не составит понять суть работы блока <http></http>
Основное что нас может заинтересовать это пакет UserDetails который возвращает все данные пользователя. Он у нас определяется в классе UserDetailsImpl.
@Transactional(readOnly = true)
public class UserDetailsImpl implements  UserDetailsService{
    private UsersDao usr = ContextLoader.getUsersDao();

    public UserDetails loadUserByUsername(String username)
            throws UsernameNotFoundException, DataAccessException {

        Users usr=this.usr.getUsersList(username);
        List authList = new ArrayList();
        authList.add(new GrantedAuthorityImpl(usr.getGrantedAuthority().getRoleName()));
        return new User(usr.getUsername(),
                usr.getPassword(),
                true,
                true,
                true,
                true,
                authList);
    }
} 
Тут мы видим что класс имплементирует интерфейс UserDetailsService который реализует единственный метод loadUserByUsername.
создадим бин класс для хранения и для всяческих  операций над данными (hibernate).

Users.java
@Entity
@Table (name="users")
public class Users implements Serializable {

    private Long id;
    private String username;
 private String password;
 private Integer enabled;
    private Roles grantedAuthority;

    @Id
    @GeneratedValue
    @Column(name = "id")
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }

    @Column(name = "username")
    public String getUsername() {
  return username;
 }

 public void setUsername(String username) {
  this.username = username;
 }
    @Column(name = "password")
 public String getPassword() {
  return password;
 }
 public void setPassword(String password) {
  this.password = password;
 }
    @Column(name = "enabled")
    public Integer getEnabled() {
  return enabled;
 }
 public void setEnabled(Integer enabled) {
  this.enabled = enabled;
 }

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "role_id")
    public Roles getGrantedAuthority()
    {
        return this.grantedAuthority;
    }

    public void setGrantedAuthority(Roles grantedAuthority)
    {
        this.grantedAuthority=grantedAuthority;
    }
}

Roles.java
@Entity
@Table(name = "roles")
public class Roles {
    private Long roleId;
    private String roleName;

    @Id
    @GeneratedValue
    @Column(name = "role_id")
    public Long getRoleId() {
        return roleId;
    }

    public void setRoleId(Long roleId) {
        this.roleId = roleId;
    }

    @Column(name = "role_name")
    public String getRoleName() {
        return roleName;
    }

    public void setRoleName(String roleName) {
        this.roleName = roleName;
    }
}
Полочка - 3


Настройка Hibernate.
Прошу если кто не знаком с данной технологией просмотрите его скажем тынц здесь

Мы будем использовать аннотации для извлечения даных с базы. Самое важное преимущество этой технологии является то что мы работаем непосредственно не таблицами БД, а с названиями объектов проекта, т.е тут применяется технология ORM.

Hibernate.xml


    
    
        
            com.zed.beans.Users
            com.zed.beans.Roles
        
    
    
       
                org.hibernate.dialect.PostgreSQLDialect
                true
                true
                5
                10
                600
                50
                false
                
            
     

    


если обратим внимание на начальный блок то можем увидеть что объявляются бин классы, куда все данные таблицы БД будут разлиты по объектам.

Выше я выложил бин класс Users.java, мы там можем увидеть аннотации как Entity сущность, @Table название таблицы, @Column название колонки и @Id название первичного ключа, @GeneratedValue говорит о том что, ключ будет генерироваться автоматом, там еще есть @OneToOne - это означает что, как должны таблицы связываться  и между объектами, в данном случае он связывается по методу один к одному по первичному ключу...
Пока все... Продолжение следует, дальше будет интереснее...

Comments